Jump to content


Photo

Problema con generadores GEN_ID


  • Please log in to reply
4 replies to this topic

#1 nizamulmulk

nizamulmulk

    Member

  • Miembros
  • PipPip
  • 10 posts

Posted 10 September 2012 - 09:31 PM

Buenas noches. Me encuentro desarrollando un nuevo sistema que usa Firebird 2.1 y tengo un problema que no entiendo, a ver si me pueden ayudar.
Tengo una tabla con id (identity) y nombre (varchar(x)).
En el trigger before insert escribí
...
begin
  new.id = GEN_ID(generador, 1);
end
La tabla está vacía, voy a insertar por primera vez. Ejecuto insert into tabla(nombre) values('pepe'); le doy commit ... y el resultado es
id=2, nombre='pepe'.
Porqué empieza siempre a numerar desde el 2? necesito el 1 !!.
Si alguno tiene la respuesta, por favor hágamelo saber. Muchas gracias
  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 posts
  • LocationEspaña

Posted 11 September 2012 - 01:18 AM

Buenas,

Un generador es un "contador" que no depende de una tabla y, mucho menos de los registros que ella contenga. Inicializa el generador a 0 y verás que el ID del primer registro que insertes valdrá 1

ALTER SEQUENCE TU_GENERADOR RESTART WITH 0


También tienes que tener en cuenta que los generadores no dependen de ninguna transacción. Es decir, imagina que insertas 10 registros en la misma transacción y que, por el motivo que sea haces un rollback de la misma. Pues bien, tu generador habrá aumentado de valor, pero esos registros no existirán.

Nos leemos
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 11 September 2012 - 07:38 AM

begin
  new.id = GEN_ID(generador, 0);
end


Se supone que cada vez que se dispara el trigger se le suma 1, así que para empezar desde el Id 1 debes empezar con 0.

Saludos.
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 11 September 2012 - 08:14 AM

begin
  new.id = GEN_ID(generador, 0);
end


Se supone que cada vez que se dispara el trigger se le suma 1, así que para empezar desde el Id 1 debes empezar con 0.

Saludos.


Creo que estás confundido amigo enecumene, el segundo parámetro que recibe la función GEN_ID es la cantidad a incrementar, por lo tanto en la mayoría de los casos (salvo una necesidad muy especial) dicho parámetro debería ser  1.

Por lo demás, como dice cadetill, por cada transacción fallida se incrementará el valor y quedarán huecos en la secuencia, si se necesitara un campo que almacene números consecutivos, los generadores no son los indicados, puesto que el único objetivo de estos es proveer un número único.

Un saludo
  • 0

#5 nizamulmulk

nizamulmulk

    Member

  • Miembros
  • PipPip
  • 10 posts

Posted 11 September 2012 - 08:43 AM

Muchas gracias, tengo todos los generadores por defecto que comienzan con uno, supuse que trabajaría al revés, asigna el nro. que tiene y después suma uno, se ve que primero suma uno y después asigna el valor.
Tengo que resetearlos a cero.
Resuelto!
  • 0




IP.Board spam blocked by CleanTalk.