Database 在父表上创建触发器,该触发器在子表中创建行,并将新的父PK作为FK分配给子表

Database 在父表上创建触发器,该触发器在子表中创建行,并将新的父PK作为FK分配给子表,database,oracle,triggers,Database,Oracle,Triggers,我有两张桌子: Customer (customerID, firstName, lastName,....) Account (accountID, currentBalance....customerID) customerID references CUSTOMER. 这些表具有1:M(客户:帐户)的强制关系。 我试图设置一个触发器,在插入父对象时自动创建子行,在研究堆栈和其他地方后,我已在父对象上创建了一个触发器,在子对象中创建了一行: CREATE OR REPLACE TRIGG

我有两张桌子:

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

Account (accountID, currentBalance....customerID) customerID references CUSTOMER.
这些表具有1:M(客户:帐户)的强制关系。 我试图设置一个触发器,在插入父对象时自动创建子行,在研究堆栈和其他地方后,我已在父对象上创建了一个触发器,在子对象中创建了一行:

CREATE OR REPLACE TRIGGER CMustHaveAccount
     AFTER INSERT ON CUSTOMER
    FOR EACH ROW
    BEGIN
        INSERT INTO ACCOUNT (accountID)
        SELECT SEQACCOUNTID.NEXTVAL
        FROM dual;
    END;
/
我所有将FK in帐户设置为新PK in客户的尝试都失败了,我尝试了许多触发器,最有希望的是:

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:表。客户正在变异,触发器/函数可能看不到 它

。 如果我将触发器更改为BEFORE,则会出现错误
ORA-01400:无法将NULL插入(“ACCOUNT”。.ACCOUNTID”)
。我假设,因为从技术上讲,插入尚未完成,所以我插入到客户中的PK还不存在

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

我正在学习SQL和数据库,如果答案显而易见,请原谅。
非常感谢您的帮助

帐户的外键是客户的主键,因此这应该适合您。注意
:new
关键字,它是如何引用当前记录中的值,从而避免“mutating table”错误


它奏效了,而且很简单。我已经连续挣扎了几个小时,非常感谢。
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;
/