【问题标题】:Create Trigger on Parent table that creates row in Child table and assigns new Parent PK to Child as FK在父表上创建触发器,在子表中创建行并将新的父 PK 作为 FK 分配给子
【发布时间】:2017-04-16 13:22:48
【问题描述】:

我有两张桌子:

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;
/

我在 Account 中将 FK 设置为 Customer 中的新 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")。我假设是因为从技术上讲,插入尚未完成,所以我插入到 Customer 的 PK 还不存在。

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

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

【问题讨论】:

    标签: database oracle triggers


    【解决方案1】:

    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;
    /
    

    【讨论】:

    • 它成功了,而且非常简单。我已经挣扎了好几个小时了,非常感谢。
    猜你喜欢
    • 2019-10-16
    • 2019-12-20
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2020-07-21
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多