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
Problema con generadores GEN_ID
Started by
nizamulmulk
, Sep 10 2012 09:31 PM
4 replies to this topic
#1
Posted 10 September 2012 - 09:31 PM
#2
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
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
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
#3
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.
#4
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
#5
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!
Tengo que resetearlos a cero.
Resuelto!