Mensaje    Asunto: Generadores - Autoincremento en Interbase / Firebird. Responder citando

Bueno pues como hize este mensaje para contestar a un compañero del foro y creo que puede ser util para muchos, pues lo pongo aquí a la vista. Quizás sea bastante util sobre todo para los que vienen de MySQL pues allí es un poquito más sencillo el tema, aunque ya vereis que aquí no presenta mayor problema.

Para tener un campo con auto-incremento en Interbase, debes utilizar los llamados generadores para ello tienes dos sentencias SQL fundamentales.

1º CREATE GENERATOR
2º SET GENERATOR

La primera como es obvio será para crearlo y la segunda para inicializarlo la primera vez.

Por ejemplo supongamos que queremos tener la siguiente tabla
Código:

CREATE TABLE articulos (
     articulo_id INTEGER NOT NULL,
     descripcion VARCHAR(25),
     ..... (más campos)
)


Luego definimos cual será la clave primaria de la tabla:
Código:

ALTER TABLE articulos ADD CONSTRAINT articulos_PK PRIMARY KEY (articulo_id);

Con eso definimos la clave primaria y le asociamos un nombre a la restricción de integridad.

Pasemos ahora a crear el generador que luego asociaremos al campo concreto con un trigger.

Primero creamos el generador y lo inicializamos a 0:
Código:

CREATE GENERATOR articulo_id_gen;
SET GENERATOR articulo_id_gen TO 0;

Lo inicializamos a 0, porque la primera vez que se llame pues se incrementará en 1 y el generador por lo tanto devolverá un 1.

Ya solo nos queda crear el trigger que llamara a incrementar el campo antes de insertar cualquier nuevo registro. El trigger lo definiremos así:
Código:

SET TERM !! ;
CREATE TRIGGER crear_articulo_id FOR articulos
    BEFORE INSERT
    POSITION 0
AS BEGIN
    NEW.articulo_id=GEN_ID(articulo_id_gen, 1);
END !!
SET TERM ; !!


Bueno una vez hecho esto, simplemente lo unico os queda es llenar la tabla de datos, en cada insercción (si os fijais en el trigger, al ser BEFORE INSERT, se llama al generador para que lo incremente en una unidad y le asigne el número devuelto por el generador al campo articulo. Esto no tiene mucho más misterio. El POSITION 0 lo ponemos para que sea el primer trigger referente a esa tabla en ejecutarse, pensad que podriamos tener varios triggers por tabla, y claro cuanto antes tenga valor la clave primaria para la tupla a tratar (en el caso de la inserción) mucho mejor.

Esto es muy útil además de conveniente, pues nos simplifica el trabajo de la creación de claves primarias, siempre y cuando se preste a ello claro.

Solo una cosa más, tened cuidado con el SET GENERATOR porque además de inicializar un generador también puedes resetearlo y podríais provocar la duplicación de campos en una tabla, aunque el servidor no lo permitiría, pero bueno es un comentario a tener en cuenta.

Bueno, espero que os haya quedado claro, si tieneis cualquier duda pues preguntar que para eso estamos,os aconsejo de todas formas que os bajeis y los tengais a mano, los PDFs de la documentación de Interbase 6.0 Open Source, pues los 2 PDFs Data Definition, Language Reference deben estar siempre a mano.

Ciao y suerte.