2012-11-20 19 views
27

Ho pensato che sarebbe stato semplice, ma non riesco a utilizzare AUTO_INCREMENT nel mio database db2. Ho fatto delle ricerche e la gente sembra usare "Generated by Default", ma questo non funziona per me.Come AUTO_INCREMENT in db2?

Se aiuta, ecco la tabella che voglio creare con il sid che viene incrementato automaticamente.

create table student(
     sid integer NOT NULL <auto increment?> 
     sname varchar(30), 
     PRIMARY KEY (sid) 
    ); 

Qualsiasi indicazione è apprezzata.

risposta

44

che stai cercando si chiama una colonna IDENTITY:

create table student (
    sid integer not null GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) 
    ,sname varchar(30) 
    ,PRIMARY KEY (sid) 
); 

Una sequenza è un'altra opzione per fare questo, ma è necessario determine which one is proper per la vostra situazione particolare. Leggi questo per maggiori informazioni comparing sequences to identity columns.

+0

Grazie Ian. Questo è dove ho iniziato. Non sono sicuro del perché, ma per qualsiasi motivo la parte "SEMPRE SEMPRE" di questa query non viene riconosciuta. Ottengo l'errore mancante giusto parens ... un indicatore non è ricodificare le parole chiave. – Matt

+0

Quale versione di DB2 è in esecuzione e su quale piattaforma? –

+0

Ti manca una virgola ('','') dopo la dichiarazione della sequenza di identità, ma altrimenti funziona sulla _my_ implementazione DB2 (non ho attivato l'inserimento nel journal, tuttavia, quindi non posso dichiarare la chiave primaria al momento). –

5

Sarà necessario creare un campo di incremento automatico con l'oggetto sequenza (questo oggetto genera una sequenza numerica).

utilizzare la seguente sintassi CREATE SEQUENCE:

CREATE SEQUENCE seq_person 
    MINVALUE 1 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 10 

Il codice precedente crea un oggetto sequenza denominata seq_person, che inizia con 1 e incrementerà di 1. Sarà anche cache fino a 10 valori per le prestazioni. L'opzione cache specifica quanti valori di sequenza saranno archiviati in memoria per un accesso più rapido.

Per inserire un nuovo record nella tabella "Persone", dovremo usare la funzione nextval (questa funzione recupera il valore successivo da sequenza seq_person):

INSERT INTO Persons (P_Id,FirstName,LastName) 
    VALUES (seq_person.nextval,'Lars','Monsen') 

L'istruzione SQL sopra sarebbe inserire un nuovo record nella tabella "Persone". Alla colonna "P_Id" verrebbe assegnato il numero successivo dalla sequenza seq_person. La colonna "FirstName" sarebbe stata impostata su "Lars" e la colonna "LastName" sarebbe stata impostata su "Monsen".

+0

Mentre concederò che DB2 ha sequenze, e questo è un uso per loro (se ricordo bene, le colonne di auto-gen possono usare lo stesso tipo di oggetto sotto le copertine), DB2 non è elencato su quella pagina. .. Hai appena copiare l'installazione di Oracle? Ricorda che ci sono molte altre grandi differenze tra Oracle e DB2 (ciò che dipende dalla versione), quindi non puoi copiare ciecamente. (Penso che trovo la mancanza di fiducia delle persone in w3schools piuttosto giustificata qui: non solo mancano DB2, ma anche PostgreSQL e Derby, che sono tutti comunemente usati ... forse più di Access) –

+0

@ Clockwork-Muse - sei corretto mentre questo tipo di costrutto funzionerà nel db2 la sintassi è diversa. – Hogan

1

Aggiunti alcuni parametri facoltativi per la creazione di sequenze "future safe".

CREATE SEQUENCE <NAME> 
    START WITH 1 
    INCREMENT BY 1 
    NO MAXVALUE 
    NO CYCLE 
    CACHE 10; 
1

hi Se non si è ancora in grado di fare da colonna AUTO_INCREMENT durante la creazione della tabella.Per ovviare prima creare tabella che è:

creare studente tabella ( sid intero NOT NULL varchar sname (30), PRIMARY KEY (SID) );

e poi esplicitamente cercare di modificare la colonna bu utilizzando il seguente

alter studente tavolo modificare la colonna insieme sid GENERATO per impostazione predefinita come IDENTITÀ

O

alter studente tavolo modificare la colonna sid set GENERATO DA DEFAULT COME IDENTITÀ (inizio con 100)