2012-03-16 16 views
15

Necesito crear una secuencia y un desencadenador para autoincrementar la clave principal en una tabla, pero no tengo idea de cómo hacerlo.Auto Increment for Oracle

Respuesta

18

crear la tabla y la secuencia

SQL> create table staff (
    2 emp_id number primary key, 
    3 staff_name varchar2(100) 
    4 ); 

Table created. 

SQL> create sequence emp_id_seq; 

Sequence created. 

Ahora, puede crear un disparador que utiliza la secuencia de poblar la tecla

primaria
SQL> create trigger trg_emp_id 
    2 before insert on staff 
    3 for each row 
    4 begin 
    5 select emp_id_seq.nextval 
    6  into :new.emp_id 
    7  from dual; 
    8 end; 
    9/

Trigger created. 

Ahora, cuando se insertan datos, no es necesario que especifique la columna EMP_ID; se completará automáticamente con el desencadenante

SQL> insert into staff(staff_name) values ('Justin'); 

1 row created. 

SQL> select * from staff; 

    EMP_ID STAFF_NAME 
---------- -------------------- 
     1 Justin 
+1

Hola, ¿se puede usar una secuencia para diferentes tablas? –

+0

@JoseDavidGarciaLlanos - Puedes, sí. Convencionalmente, crearías secuencias separadas para cada tabla. Eso reduce la contienda entre las sesiones que realizan inserciones en diferentes tablas, por ejemplo. –

+0

Gracias por la guía y el código de activación –

18

Lea esto, Hermoso artículo.

cómo secuencia [auto increment in oracle]

sintaxis

Create sequence sequence_name 
start with value 
increment by value 
minvalue value 
maxvalue value; 

ejemplo

SQL> create table emp (
emp_id number(10), 
fname varchar2(25), 
lname varchar2(25), 
constraint pk_emp_id PRIMARY KEY(emp_id) 
); 

SQL> Create sequence emp_sequence 
start with 1 
increment by 1 
minvalue 1 
maxvalue 10000; 

SQL> insert into emp (emp_id,fname,lname) values(emp_sequence.nextval,'Darvin','Johnson'); 
SQL> insert into emp (emp_id,fname,lname) values(emp_sequence.nextval,'Mig','Andrews'); 
SQL> insert into emp (emp_id,fname,lname) values(emp_sequence.nextval,'Alex','Martin'); 
SQL> insert into emp (emp_id,fname,lname) values(emp_sequence.nextval,'Jon','paul'); 
SQL> insert into emp (emp_id,fname,lname) values(emp_sequence.nextval,'Yatin','Bones'); 

en emp_sequence.nextval donde emp_sequence es el nombre de la secuencia que hemos creado anteriormente y nextval es una función que se utiliza para asignar el next number from emp_sequence to emp_id columna en la tabla emp.

SQL> select * from emp; 

    EMP_ID FNAME      LNAME 
---------- ------------------------- ------------------------- 
     1 Darvin     Johnson 
     2 Mig      Andrews 
     3 Alex      Martin 
     4 Jon      paul 
     5 Yatin      Bones 
+0

Gracias, muy limpio, ¿puedo usar la misma secuencia para cualquier tabla que requiera un incremento automático? también qué parte es el disparador? –

+1

Por curiosidad, ¿por qué leer eso dos veces? –

+0

muy bien explicado, gracias –

7

Prueba esto:

create sequence seq_EmpID start with 1 increment by 1 


insert into Emp_Table values(seq_EmpID.nextval,'Ram') 
+1

dulce y simple, gracias a ti también –

0

Muy buena pregunta !! Probablemente secuencia se puede utilizar de esta manera - asimismo, no estoy seguro de si realmente hay una diferencia:

CREATE SEQUENCE emp_id_seq MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10; 
+0

Esto es casi idéntico a otra respuesta. –

-1

Si utiliza una secuencia de varias mesas, ya que el valor de la secuencia es ejemplo inconsistentes: tenemos dos tablas emp y depeartement: Si uso la secuencia en emp tendría: ID_dept = 6 porque el 5 ya está usado en la otra tabla.

ejemplo:

SQL> insert into emp values(masequence.nextval,'aaa'); 

1 ligne crÚÚe.

SQL> insert into departement values(masequence.nextval,'aaa'); 

1 ligne crÚÚe.

SQL> select * from emp; 

    ID_EMP NOM_EMP 
---------- ------------------------- 
     5 aaa 

SQL> select * from departement; 

    ID_DEPT NOM_DEPT 
---------- ---------- 
     6 aaa 

SQL> 
Cuestiones relacionadas