我有两张桌子:
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和数据库,如果答案很明显,请原谅。 非常感谢!
答案 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;
/