2009-05-12 21 views
5

Esiste un RDMS generale incrociato, in cui è possibile generare automaticamente una chiave su un inserto JDBC? Per esempio, se ho una tabella con una chiave primaria, id, e un valore int:Chiave di generazione automatica sull'inserto JDBC in SQL Server

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

e fare un inserto

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

ottengo un java.sql.SQLException: Impossibile inserire il valore NULL nella colonna 'id'.

Ho la sensazione che sia interamente dipendente da RDMS. Stiamo utilizzando SQL Server 2005 e ho impostato

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] 

in tabella senza fortuna.

risposta

6

Questo dipende completamente dal database. Esistono due opzioni principali: 1 - DBMS che consentono una parola chiave a incremento automatico accanto alla definizione della chiave primaria e 2 - DBMS che forniscono generatori di sequenza (che è quindi possibile utilizzare per generare i nuovi valori per PK, ad esempio scrivendo un trigger "before insert" che inserisce automaticamente il nuovo valore nella colonna prima di completare l'inserimento).

quanto ne so:

  1. Firebird utilizza sequenze
  2. DB2 permette di definire una colonna come "GENERATO predefinito come IDENTITÀ";
  3. Interbase utilizza sequenze (detti generatori)
  4. MySQL contiene la clausola "AUTO_INCREMENT"
  5. Oracle utilizza sequenze
  6. PostgreSQL utilizza sequenze
  7. SQLServer ha il "IDENTITY (1,1)" clausola
+0

Per DB2 è possibile scegliere tra una colonna di identità e una sequenza. Potrei immaginare ciò che conta anche per gli altri rdbms. – rudolfson

+0

Grazie per il chiarimento. Tuttavia questo non conta per altri rdbms. Almeno non per Oracle. –

1

Per quanto ne so dipende dal database. Allo stesso modo con l'inserimento di timestamp; alcuni inseriranno l'ora corrente quando inserisci un valore nullo.

2

È necessario impostare la colonna id nella tabella di prova per l'autocreazione di un'identità. Nel caso di SQL Server, è necessario impostare la proprietà IDENTITY() nella colonna ID.

2

Questo dipende dal database. Oracle richiede la creazione di una SEQUENCE e su MySQL è sufficiente impostare la colonna come incremento automatico.

È possibile utilizzare sempre Ibernazione.

+0

Per spiegarlo meglio: utilizzando Hibernate è possibile generare il DDL o addirittura consentire a Hibernate di creare tutte le tabelle associate all'avvio. Dovresti semplicemente dire ad Hibernate il database di destinazione usando il "dialetto" appropriato. – rudolfson

Problemi correlati