2012-03-16 110 views
15

我需要创建一个序列和一个触发器来自动递增表上的主键,但我不知道如何去做。自动增量为Oracle

回答

18

创建表和序列

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. 

现在,你可以创建一个使用该序列来填充主键

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. 

现在,当您插入数据的触发,您无需指定EMP_ID列 - 它将自动填充触发器

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

1 row created. 

SQL> select * from staff; 

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

嗨,真棒可以序列用于不同的表? – 2012-03-16 07:09:42

+0

@JoseDavidGarciaLlanos - 你可以,是的。通常,您可以为每个表创建单独的序列。例如,这可以减少在不同表上插入的会话之间的争用。 – 2012-03-16 07:13:22

+0

感谢您的指导和触发代码 – 2012-03-16 07:31:55

18

阅读,美丽的文章。

如何序列[auto increment in oracle]

语法

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

例如

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'); 

emp_sequence.nextval其中emp_sequence是我们在上面和nextval创建序列的名称是用于分配的功能next number from emp_sequence to emp_id 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

感谢,非常整洁,我可以使用相同的序列的任何表需要自动增量?还有哪部分是触发器? – 2012-03-16 07:00:46

+1

出于好奇,为什么要读那两次? – 2012-03-16 07:23:00

+0

很好解释,谢谢 – 2012-03-16 07:32:13

7

试试这个:

create sequence seq_EmpID start with 1 increment by 1 


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

甜美简单,多亏你也 – 2012-03-16 07:33:21

0

非常好的问题! 大概序列可以以这种方式使用的 - 也是,我不知道是否真的有一个区别:

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

这与其他答案几乎完全相同。 – 2014-03-12 03:11:36

-1

如果使用序列数表,因为序列的价值是不一致的例子: 我们有两个表emp和depeartement: 如果我在emp上使用序列,我会得到:ID_dept = 6,因为5已经用在另一个表中。

例如:

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

1 LIGNEcrÚÚe。

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

1 lignecrÚÚe。

SQL> select * from emp; 

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

SQL> select * from departement; 

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

SQL>