Autor Tema: Obtener el numero autogenerado.  (Leído 11811 veces)

0 Usuarios y 1 Visitante están viendo este tema.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Obtener el numero autogenerado.
« 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.
« última modificación: Junio 16, 2011, 12:53:59 am por YvanB »
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Obtener el numero autogenerado.
« Respuesta #1 en: Junio 15, 2011, 09:46:38 pm »
yo en SQL Server uso SELECT SCOPE_IDENTITY() AS id despues del mismo INSERT INTO.

en MySQL es SELECT LAST_INSERT_ID()

saludos.



YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Obtener el numero autogenerado.
« Respuesta #2 en: Junio 15, 2011, 09:50:55 pm »
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:
Código: (vb6) [Seleccionar]
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.
« última modificación: Junio 15, 2011, 09:58:43 pm por YvanB »
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Obtener el numero autogenerado.
« Respuesta #3 en: Junio 15, 2011, 10:00:14 pm »
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.

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Obtener el numero autogenerado.
« Respuesta #4 en: Junio 15, 2011, 10:09:06 pm »
Y la verdad no funciona o no se como pero siempre trae 0 "cero"
« última modificación: Junio 15, 2011, 10:15:48 pm por enterariel »
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Obtener el numero autogenerado.
« Respuesta #5 en: Junio 15, 2011, 10:12:43 pm »
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.
Me encuentras en YAcosta.com

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Obtener el numero autogenerado.
« Respuesta #6 en: Junio 15, 2011, 10:52:47 pm »
Por ahora lo estoy usando asi va bien tambien pero voy a probar el método de IvanB a ver que tal va.

Código: [Seleccionar]
        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
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Obtener el numero autogenerado.
« Respuesta #7 en: Junio 15, 2011, 10:59:31 pm »
Y no puedes leer AutoIncrement???  no esta alli el ultimo valor???
Me encuentras en YAcosta.com

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Obtener el numero autogenerado.
« Respuesta #8 en: Junio 15, 2011, 11:40:17 pm »
Y no puedo leer, lo que hago hay  es registro reiniciar a 1 el auto-increment si no contiene la tabla ningún registro.
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Obtener el numero autogenerado.
« Respuesta #9 en: Junio 15, 2011, 11:44:16 pm »
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:

Código: [Seleccionar]
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.
« última modificación: Junio 15, 2011, 11:45:51 pm por seba123neo »

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Obtener el numero autogenerado.
« Respuesta #10 en: Junio 16, 2011, 12:45:39 am »
Buena esa seba123neo funciona espectacular.

Código: [Seleccionar]
SELECT AUTO_INCREMENT AS xCodigo
FROM information_schema.tables
WHERE table_name='piezas'

Solucionado el Tema, muchas gracias.
« última modificación: Junio 16, 2011, 12:51:22 am por enterariel »
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Obtener el numero autogenerado.
« Respuesta #11 en: Junio 16, 2011, 12:53:51 am »
Muy bien, problema resuelto.
Me encuentras en YAcosta.com