2010-04-06 32 views
6

me gustaría lograr una identidad o el valor de incremento automático en una columna de ala de SQL Server:Autoincrement clave principal en la base de datos Oracle

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

¿Cómo puede hacerse esto?

+3

posible duplicado de http://stackoverflow.com/questions/317001/autoincrement-in-oracle – DCookie

Respuesta

10

Como dice Orbman, la forma estándar de hacerlo es con una secuencia. Lo que la mayoría de las personas también hace es juntar esto con un disparador de inserción. Por lo tanto, cuando se inserta una fila sin una identificación, el disparador se dispara para completar la identificación de la secuencia.

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; 

Este es uno de los pocos casos en los que tiene sentido utilizar un desencadenador en Oracle.

+0

recuerde que el disparo no es del todo necesario. Siempre que se realice una inserción, se usa el valor de la secuencia, está bien. No es automático, pero tampoco requiere mucha disciplina. Intento desesperadamente evitar los desencadenantes por cuestión de gusto personal. –

+0

@ Adam, estoy totalmente de acuerdo. Este es uno de los pocos lugares en los que usaré un disparador, principalmente debido a la horrenda falta de estándares de nomenclatura en la base de datos que cuido, por lo que es casi imposible saber la secuencia correcta para usar. –

4

Si realmente no le importa qué contiene la clave principal, puede usar un tipo RAW para la columna de clave principal que contiene un guid generado por el sistema en forma binaria.

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