2010-04-06 4 views
6

vorrei raggiungere un'identità o un valore incremento automatico in una colonna ala di SQL Server:autoincremento chiave primaria nel database Oracle

CREATE TABLE RollingStock 
( 
     Id NUMBER IDENTITY(1,1), 
     Name Varchar2(80) NOT NULL  
); 

Come si può fare?

+3

possibile duplicato di http://stackoverflow.com/questions/317001/autoincrement-in-oracle – DCookie

risposta

10

Come dice Orbman, il modo standard per farlo è con una sequenza. Ciò che la maggior parte delle persone fa anche è accoppiare questo con un trigger di inserimento. Quindi, quando una riga viene inserita senza un ID, il trigger si attiva per compilare l'ID per te dalla sequenza.

CREATE SEQUENCE SEQ_ROLLINGSTOCK_ID START WITH 1 INCREMENT BY 1 NOCYCLE; 

CREATE OR REPLACE TRIGGER BI_ROLLINGSTOCK 
BEFORE INSERT ON ROLLINGSTOCK 
REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 
WHEN (NEW.ID IS NULL) 
BEGIN 
    select SEQ_ROLLINGSTOCK_ID.NEXTVAL 
    INTO :NEW.ID from dual; 
END; 

Questo è uno dei pochi casi in cui ha senso utilizzare un trigger in Oracle.

+0

Si noti che il grilletto non è del tutto necessario. Finché ogni volta che viene eseguito un inserimento, viene utilizzato il valore della sequenza che stai bene. Non è automatico, ma non richiede molta disciplina neanche. Cerco disperatamente di evitare i trigger come una questione di gusto personale. –

+0

@Adam, sono totalmente d'accordo. Questo è uno dei pochi posti in cui userò un trigger, principalmente a causa dell'orrenda mancanza di standard di denominazione nel database che mi occupo, rendendo quasi impossibile conoscere la sequenza corretta da utilizzare. –

4

Se davvero non ti interessa ciò che detiene la chiave primaria, puoi usare un tipo RAW per la colonna chiave primaria che contiene un guid generato dal sistema in forma binaria.

CREATE TABLE RollingStock 
( 
    ID RAW(16) DEFAULT SYS_GUID() PRIMARY KEY, 
    NAME VARCHAR2(80 CHAR) NOT NULL  
);