gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:24:28 26 4
gpt4 key购买 nike

我有两个表:

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

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

这些表具有 1:M (Customer:Account)、强制-强制关系。我正在尝试设置一个触发器,在插入父项时自动创建子行,在研究 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: table .CUSTOMER is mutating, trigger/function may not see it

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

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

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

最佳答案

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

关于database - 在父表上创建触发器,在子表中创建行并将新的父 PK 作为 FK 分配给子表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43437734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com