2009-05-12 12 views
5

¿Existe una forma general, cruzada de RDMS, de que pueda generar una clave automáticamente en una inserción JDBC? Por ejemplo, si tengo una tabla con una clave principal, identificación, y un valor int:Generación automática de clave en la inserción de JDBC en SQL Server

create table test (
    id int not null, 
    myNum int null 
) 

y hago una inserción

PreparedStatement statement = connection.prepareStatement("insert into test(myNum) values(?)", Statement.RETURN_GENERATED_KEYS); 
statement.setInt(1, 555); 
statement.executeUpdate(); 
     statement.close(); 

consigo un java.sql.SQLException: No se puede insertar el valor NULL en la columna 'id'.

Tengo la sensación de que depende por completo de RDMS. Estamos utilizando el uso de SQL Server 2005 y he configurado

CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 1) ON [PRIMARY] 

en la tabla sin suerte.

Respuesta

6

Esto depende completamente de la base de datos. Hay dos opciones principales: 1 - DBMS que permiten una palabra clave de incremento automático junto a la definición de clave principal y 2 - DBMS que proporcionan generadores de secuencia (que luego puede usar para generar los nuevos valores para PK, por ejemplo escribiendo un activador "antes de insertar" que inserta automáticamente el nuevo valor en la columna antes de completar la inserción).

Por lo que sé:

  1. Firebird utiliza secuencias
  2. DB2 permite definir una columna como "generado por DEFAULT como la identidad";
  3. Interbase utiliza secuencias (llamados generadores)
  4. MySQL tiene la cláusula "AUTO_INCREMENT"
  5. Oracle utiliza secuencias
  6. PostgreSQL usa secuencias
  7. SQLServer tiene la "identidad (1,1)" cláusula
+0

Para DB2 puede elegir entre una columna de identidad y una secuencia. Pude imaginar que esto cuenta para otros rdbms, también. – rudolfson

+0

Gracias por la aclaración. Sin embargo, esto no cuenta para otros rdbms. Al menos no para Oracle. –

1

Por lo que yo sé, depende de la base de datos. Del mismo modo con la inserción de marcas de tiempo; algunos insertarán la hora actual cuando insertes un nulo.

2

Debe establecer la columna de identificación en la tabla de prueba para crear automáticamente una identidad. En el caso de SQL Server, debe establecer la propiedad IDENTITY() en la columna ID.

2

Depende de la base de datos. Oracle requiere que se cree una SECUENCIA y en MySQL solo configura la columna como incremento automático.

Siempre puedes usar Hibernate.

+0

Para explicarlo un poco más: utilizando Hibernate, podría generar el DDL o incluso dejar que Hibernate cree todas las tablas asignadas al inicio. Tendría que decirle a Hibernate la base de datos de destino usando el "dialecto" apropiado. – rudolfson

Cuestiones relacionadas