2012-03-16 12 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

こんにちは、シーケンスは、異なるテーブルのために使用することができますか? –

+0

@JoseDavidGarciaLlanos - はい、できます。従来は、各テーブルごとに別々のシーケンスを作成していました。これは、たとえば、異なるテーブルに挿入を行うセッション間の競合を減らします。 –

+0

ガイダンスとトリガーコードをお寄せいただきありがとうございます。 –

18

この記事を読む、美しい記事。 emp_sequenceは、我々は上記で作成したシーケンスの名前で、nextvalを割り当てるために使用されている機能ですemp_sequence.nextval

どのシーケンス[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'); 

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

自動インクリメントが必要なすべてのテーブルで同じシーケンスを使用できますか。どの部分もトリガーですか? –

+1

好奇心から、それをなぜ2度読むのですか? –

+0

非常によく説明されています、ありがとうございます。 –

7

はこれを試してみてください:

create sequence seq_EmpID start with 1 increment by 1 


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

甘くてシンプルで、あなたもありがとう –

0

非常に良い質問を! おそらくシーケンスは、このように使用することができます - また、私は実際に差があるかどうかわからないです:

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

これは別の答えとほとんど同じです。 –

-1

シーケンスの値が矛盾の例であるので、あなたは、いくつかのテーブルの列を使用する場合: 我々は2つのテーブルempとdepeartementを持っています: 私はempでシーケンスを使用する場合:5はすでに他のテーブルで使用されているので、ID_dept = 6。

例:

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

1 LIGNEのcrÚÚe。

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

1リグルチレ。

SQL> select * from emp; 

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

SQL> select * from departement; 

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

SQL> 
関連する問題