【发布时间】: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 和数据库,如果答案很明显,请见谅。 非常感谢您的帮助!
【问题讨论】: