2012-10-28 41 views
0

我有兩個表之間存在一個一對多的關係:觸發器在Oracle中自動遞增的字段,並插入到關聯表

table1: 

NUMBER users_id (primary key) 
field2 
field3 
... 

table2: 

NUMBER users_id (foreign key) 
VARCHAR2 name 
... 
... 

,當我INSERTtable1,我想汽車增量(序列?)users_id並插入一些記錄到table2都具有相同的users_id所以我最終

table1: 

1,val1,val2 

table2: 

1,barry,... 
1,bob,... 
1,james,... 

我想我需要一個觸發一個序列自動遞增users_idtable1中,並在table2中創建行。

它可能不相關,但我是從PHP腳本做到這一點。

UPDATE

到目前爲止,我有一個序列,並建立了一個觸發,所以我可以INSERTtable1並有users_id場自動遞增:

create sequence user_seq 
start with 1 
increment by 1 
nomaxvalue; 

create trigger user_trigger 
before insert on table1 
for each row 
begin 
select user_seq.nextval into :new.users_id from dual; 
end; 

所以現在我只需要自動插入到第二個表中。

非常感謝。

+0

您想只將users_id插入到table2中嗎? – user75ponic

+0

不,我想插入一些'name'值到'table2'中,但也需要'users_id',所以我有一個關聯。非常感謝。 – ale

+0

我對PHP不熟悉,但是在插入語句中有一個'returns clause',可以返回id(剛剛插入) –

回答

3

可以使用insert語句的returning into子句在新記錄插入到table1後返回users_id值。您也可以使用user_seq.currval來獲取序列的當前值。下面是一個例子(在這個例子中一個簡單的存儲過程已實現來證明insert into條款的使用情況,您可以根據您的要求,實現了類似的存儲過程。):以後你可以直接

SQL> create table Tb_table_1(
    2 user_id number primary key, 
    3 field_1 number 
    4 ); 

Table created 

SQL> 
SQL> create table Tb_table_2(
    2 user_id number references tb_table_1(user_id), 
    3 name1 varchar2(17) 
    4 ); 

Table created 

SQL> create sequence user_seq 
    2 start with 1 
    3 increment by 1 
    4 nomaxvalue; 

Sequence created 

SQL> 
SQL> create trigger user_trigger 
    2 before insert on tb_table_1 
    3 for each row 
    4 begin 
    5 select user_seq.nextval into :new.user_id from dual; 
    6 end; 
    7/

Trigger created 

    SQL> create or replace procedure Insert_Record 
    2 is 
    3 l_cur_id number; 
    4 begin 
    5 insert into Tb_table_1(Field_1) 
    6  values(123) 
    7 returning user_id into l_cur_id; -- store user_id of the new inserted record 
    8 for i in 1..5     -- in a local variable for later use 
    9 loop 
10  insert into tb_table_2(user_id, name1) -- insert a bunch of sample data into table2 using previously stored user_id. 
11  values(l_cur_id, dbms_random.string('l', 7)); 
12 end loop 
13 commit; 
14 end; 
15/

Procedure created 

SQL> select * from tb_table_1; 

    USER_ID FIELD_1 
---------- ---------- 

SQL> select * from tb_table_2; 

    USER_ID NAME1 
---------- ----------------- 



SQL> exec insert_record; 

PL/SQL procedure successfully completed 

SQL> select * from tb_table_1 
    2 ; 

    USER_ID FIELD_1 
---------- ---------- 
     1  123 

SQL> select * from tb_table_2; 

    USER_ID NAME1 
---------- ----------------- 
     1 jzsdbna 
     1 ozbibgs 
     1 btxrxcm 
     1 hxwwpzc 
     1 sdjbwzi 

SQL> 

在Oracle 11g中將序列值分配給一個變量:

:new.users_id := user_seq.nextval; 
+0

PERFECT。謝謝。標記爲'已解決'和+1,因爲我從這個腳本中學到了許多關於Oracle的新東西(我來自MySQL背景) – ale