Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Firebird y campos de autoincremento

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Firebird y campos de autoincremento Responder citando

Aunque se salga un poco del tema de este foro. ¿Alguien sabe cómo crear una tabla en Firebird con un campo numérico que sea la clave primaria de la tabla y además que sea autoincremental, es decir que se incremente automáticamente con cada nuevo registro que se inserte a la tabla?

Un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Bueno vamos a ver si te puedo ayudar.

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 te queda es llenar la tabla de datos, en cada insercción (si te fijas 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, piensa que podriamos tener varios triggers por tabla, y claro cuanto antes tengo 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, ten cuidado con el SET GENERATOR porque además de inicializar un generador también puedes resetearlo y podrías 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 te haya quedado claro, si tienes cualquier duda pues pregunta que para eso estamos, te aconsejo de todas formas que te bajes y los tengas 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.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.