在Parent表上创建Trigger,在Child表中创建行,并将新的Parent PK分配给Child作为FK

时间:2017-04-16 13:22:48

标签: database oracle triggers

我有两张桌子:

Customer (customerID, firstName, lastName,....)

Account (accountID, currentBalance....customerID) customerID references CUSTOMER.

表格为1:M(客户:账户),强制性 - 强制性关系。 我正在尝试设置一个触发器,在插入父项时自动创建子行,在研究Stack和其他地方后,我设法在父项上创建一个触发器,在子项中创建一行:

CREATE OR REPLACE TRIGGER CMustHaveAccount
     AFTER INSERT ON CUSTOMER
    FOR EACH ROW
    BEGIN
        INSERT INTO ACCOUNT (accountID)
        SELECT SEQACCOUNTID.NEXTVAL
        FROM dual;
    END;
/

我所有尝试将帐户中的FK设置为​​客户的新PK都失败了,我尝试了一些触发器,最有希望的是:

CREATE OR REPLACE TRIGGER AMustHaveCustomer
     AFTER INSERT ON CUSTOMER
    FOR EACH ROW
    BEGIN
        INSERT INTO ACCOUNT (customerID)
        SELECT :new.customerID
        FROM CUSTOMER;
    END;
/

此触发器会抛出错误

  

ORA-04091:表.CUSTOMER正在变异,触发/功能可能看不到   它

。 如果我将触发器更改为BEFORE,则会给出错误ORA-01400: cannot insert NULL into ("ACCOUNT"."ACCOUNTID")。我假设因为技术上插件还没有完成所以我插入客户的PK还不存在。

我希望有一个触发器可以在Account中插入一个值,使用我的序列中的主键,在Customer中创建一行时,以及PK customerID自动分配给ACCOUNT中的customerID作为外键。

我只是在学习SQL和数据库,如果答案很明显,请原谅。 非常感谢!

1 个答案:

答案 0 :(得分:2)

ACCOUNT的外键是CUSTOMER的主键,所以这应该对你有用。请注意:new关键字,它是如何引用当前记录中的值,从而避免“变异表”错误。

CREATE OR REPLACE TRIGGER CMustHaveAccount 
AFTER INSERT ON CUSTOMER 
FOR EACH ROW 
BEGIN 
    INSERT INTO ACCOUNT (accountID, currentBalance, customerID) 
    values ( SEQACCOUNTID.NEXTVAL, 0, :NEW.customerID); 
END;
/
相关问题