使用触发器在Oracle数据库11g中插入从属表

时间:2018-07-12 03:37:53

标签: oracle oracle11g triggers insert foreign-keys

例如,我正在使用3个表: A,B和C

我正在表 A 上创建触发器。因此,在触发器内部,我将一条记录插入表 B (作为 C 的主记录),然后,我需要在表 C 中插入另一条记录

我正在A表上使用触发器,因为我需要使用 A 表中的值在表 B 中创建记录,并且然后我使用信息将新记录插入表 C 中。

我正在将第一条记录插入表 B 中后,使用该代码片段“ RETURNING new_B_Id INTO b_lastid ;”新插入的id,但是当我尝试插入表 C 时,会抛出此消息:

  

B 上不存在主记录。

有什么想法要解决吗?

1 个答案:

答案 0 :(得分:1)

作为一个示例,这是可能最有效的方法,并且确实起作用了:a sqlfiddle demo to prove it

create table a (a_id number  primary key
                , txt varchar2(24))
/
create table b (b_id number  primary key
                 , a_id number not null
                 , constraint b_a_fk foreign key (a_id) references a)
/
create table c (c_id number primary key
                , b_id number not null
                , constraint c_b_fk foreign key (b_id) references b)
/
create sequence a_seq start with 10
/
create sequence b_seq start with 20
/
create sequence c_seq start with 30
/

create or replace trigger a_trg
after insert on a for each row
declare
    new_b_id number;
begin
    insert into b (b_id, a_id) values (b_seq.nextval, :new.a_id)
    returning b_id into new_b_id;     
    insert into c (c_id, b_id) values (c_seq.nextval, new_b_id);
end;
/

因此,您遇到的问题将在于我上面发布的内容和您自己的代码中的内容之间的差距。由于问题似乎是插入ORA-02291: integrity constraint的{​​{1}}上,因此我将仔细查看您在该表上定义的外键约束:它是否确实引用了C上的主键?