Campos autoincrementables

Siempre me ha llamado la atención de como se declaran los famosos campos auto incrementables en las distintas bases de datos por lo menos en las que he usado, y ahora mas ya que he estado usando intensamente JPA.



Acá pondré un resumen de como se declaran:

MySQL

campo [(longitud)] [not null] auto_increment primary key

Es necesario definir un campo autoincrementable de llave primaria en MySQL ya que este asi lo requiere de lo contrario no se puede declarar este tipo de campo.
Ejemplo:

create table prueba (
id int not null auto_increment primary key
)


PostgreSQL

campo serial [not null]

En PostgreSQL por el contrario que MySQL no requiere que un campo de tipo serial sea una llave primaria ejemplo:

create table prueba (
id serial not null
)

SQL Server / Sybase

En el caso de SQL Server / Sybase es mucho mas simple solo basta utilizar esta sintaxis:


campo int identity [(inicio,incremento)]

Ejemplo:

create table prueba (
id int identity
)

O sino si queremos que comience desde 3 y su incremento sea de dos en dos lo declaramos asi:

create table prueba (
id int identity(3,2)
)

Apache Derby

campo int [not null] generated always as identity [(start with [cantidad], increment by [cantidad])]

Derby es el gestor de base de datos de Apache, que viene incluido en el JDK 1.6, y lo podemos usar a traves de Netbeans, dos ejemplos de declaracion serian:

create table prueba (
id int not null generated always as identity
)

En el ejemplo anterior el campo id se generara como campo auto incrementable, con los valores por defecto que comienza a contar desde uno y su incremento es de uno en uno.

Ahora veamos este otro:

create table prueba (
id int not null generated always as identity (start with 5, increment by 2)
)

En la declaracion anterior estoy creando un campo de tipo autoincrementable que comience en cinco y su incremento sera de dos en dos.

Oracle

En el caso de Oracle es un poco mas trabajoso ya que no existe un tipo auto incrementable. Lo que se debe de hacer es primero crear un campo de tipo Number, luego crear una secuencia y por ultimo crear un trigger que realizara el autoincremento cada vez se haga un insert.

Ejemplo de todo esto seria:

create table prueba (
id number not null primary key,
descripcion varchar2(20)
)

Ya creada la tabla ahora crearemos una secuencia que comience desde uno y que se incremento en uno tambien.

create sequence seq_id_prueba
start with 1
increment by 1
nomaxvalue;

Hecha la secuencia debemos crear el trigger para que se utilice la secuencia para cada insert que le hagamos a la tabla.

create trigger trig_id_prueba
before insert on prueba
for each row
begin
select seq_id_prueba.nexval into :new.id from dual;

end;

Ahora cada vez que hagamos un insert podremos hacerlo asi:

insert into prueba(descripcion) values('Una fila');

Espero que les sirva este pequeno resumen ya que me costo un webo terminarlo aun cuando se ve sencillo ya que lo empece desde el domingo y hasta el dia de hoy logre terminarlo.

Comentarios (3)

3 Response to "Campos autoincrementables"

  1. Robertux says:
    miércoles, diciembre 03, 2008

    Puya esta interesante eso de los campos autoincrementables, yo nunca les he llevado fe y menos como claves primarias, prefiero generarlas a pie desde codigo especialmente porque no siempre estoy seguro de como los manejan los wrappers que te evitan realizar las consultas SQL directamente, como por ejemplo el JPA del que ya hablaste.

    Si genero una entity, por ejemplo, de una tabla con un campo autoincrementable, tendria que dejar esta propiedad a la hora de hacerlo persistente?

  2. Daniel Alberto says:
    miércoles, diciembre 03, 2008

    @Robertux:

    Tenes que dejar la "propiedad" (como te he entendido) en la clase Entity, para que esta te genere el valor autoincrementable.

    En el caso de Oracle o PostgreSQL (este ultimo genera secuencias y triggers como Oracle por medio de su tipo de dato serial) van a hacer uso de las secuencias.

    Saludos

  3. Guillermo says:
    jueves, diciembre 04, 2008

    pues al menos tenes dos webos y te ha quedado el otro de respuesto ... jajaja ...

    gracias por la info ;-) ...