Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: YAcosta en Junio 15, 2011, 09:42:37 pm
-
Me adelanto a mi amigo @enterariel en esta publicación, pero por si se le pasa.
El queria saber como obtener el autogenerado siguiente o el ultimo registrado y borrado. Yo lo hago en Firebird en 2 lineas de codigo,
pero el quiere saberlo en MySQL.
Ejemplo
5 registros, el id es autogenerado y esta del 1 al 5.
para saber el ultimo se usa last_insert_id.
Pero en eso borramos los 5 registros, a continuación el primer registro que ingrese tendrá de Id el 6.
en este caso last_insert_id ya no funciona.
Pregunta ¿Como obtengo el 6 antes de hacer la insercion en MySQL?
En Firebird existen los Generadores, una tabla donde se almacenan esos números y se puede acceder a ellos, existe algo similar en MySQL?
Gracias.
-
yo en SQL Server uso SELECT SCOPE_IDENTITY() AS id despues del mismo INSERT INTO.
en MySQL es SELECT LAST_INSERT_ID()
saludos.
-
Se deseas saber ANTES de hacer el insert. Ya seguro responde enterariel, y lo que el explica es que cuando la tabla esta vacia
SELECT LAST_INSERT_ID()
le da 1 y no 6 que es el que realmente quiere.
Por ejemplo en Firebird obtengo el ultimo numero que use sin preguntar en la tabla en si, es:
Dim rs As New ADODB.Recordset
rsGEN_MITABLA.Open "SELECT Gen_ID(GEN_MITABLA, 0) FROM RDB$DATABASE", dB, 1, 1
sqlGEN = rsGEN_MITABLA.Fields(0)
y sqlGEN tendria el 6 asi la tabla este vacia. Aqui hice la pregunta al generador de autonumerico, no a la tabla MITABLA.
-
el de SQL Server que te dije, funciona como tiene que funcionar, o sea si tenes mil registros, y borras todos, el proximo que insertes el SCOPE_IDENTITY() te trae 1001, el de MySQL no lo probe, que trucho si no funciona asi entonces.
-
Y la verdad no funciona o no se como pero siempre trae 0 "cero"
-
Lo que dices de SQL Server a mi me servirá pronto por un cliente. La cosa era con MySQL porque el trabaja con ello. Yo imagino que MySQL por algun lado guardara el numero siguiente que sirve para cuando la tabla esta vacia, lo que no se es si permite al acceso a esa tabla al DBA o al programador.
En todo caso le propuse a enterariel un truco que no se si funcara en MySQL.
En el load o activate de su form de nuevo registro
if rs.recorcount = 0 then
rs.begintrans
rs.execute "insert into etc etc etc"
MiUltimoId = SELECT LAST_INSERT_ID() - 1
rs.RollbackTrans
endif
Text1 = MiUltimoId
Es una idea.
-
Por ahora lo estoy usando asi va bien tambien pero voy a probar el método de IvanB a ver que tal va.
StrSQL = "SELECT codigo FROM piezas"
rsADO.Open StrSQL, cnADO, adOpenStatic, adLockOptimistic, adCmdText
If rsADO.RecordCount = 0 Then
ComandoSQL = "ALTER TABLE piezas AUTO_INCREMENT=1"
cnADO.Execute ComandoSQL
NCodigo = 1
Else
With rsADO
rsADO.MoveLast
NCodigo = Val(.Fields("codigo")) + 1
End With
End If
txtCodigo.Text = NCodigo
-
Y no puedes leer AutoIncrement??? no esta alli el ultimo valor???
-
Y no puedo leer, lo que hago hay es registro reiniciar a 1 el auto-increment si no contiene la tabla ningún registro.
-
una solucion puede ser leerlo de la tabla de informacion del esquema, ahi se guarda el ultimo numero de la tabla que le digas,en un campo llamado "AUTO_INCREMENT", asi:
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name='tabla1' AND table_schema = 'prueba'
en "table_schema" debes especificar el nombre de la base de datos.
saludos.
-
Buena esa seba123neo funciona espectacular.
SELECT AUTO_INCREMENT AS xCodigo
FROM information_schema.tables
WHERE table_name='piezas'
Solucionado el Tema, muchas gracias.
-
Muy bien, problema resuelto.