gpt4 book ai didi

oracle - 在更新或删除 oracle 中 2 个表之间的 FK 约束后触发

转载 作者:行者123 更新时间:2023-12-01 15:34:04 26 4
gpt4 key购买 nike

我有以下表格:

create table emp_test_lucian as select employee_id,last_name,first_name,department_id from employees;
ALTER TABLE emp_test_lucian
ADD PRIMARY KEY (employee_id);

create table dept_test_lucian as select department_id,department_name from departments_copy;
ALTER TABLE dept_test_lucian
ADD PRIMARY KEY (department_id);

我想在这个表上执行不同的操作,例如:如果一个部门被删除(从 dept_test_lucian 中),我将删除 emp_test_lucian 中具有该部门 ID 的所有行和触发器。当使用以下代码声明 2 之间没有 fk 时,这可以正常工作:

CREATE OR REPLACE TRIGGER triger5
BEFORE UPDATE or DELETE on dept_test_lucian
FOR EACH ROW
BEGIN
IF DELETING then
delete
from emp_test_lucian
where department_id = :OLD.department_id;
else if UPDATING('department_id') then
UPDATE emp_test_lucian
set department_id = :NEW.department_id
where department_id = :OLD.department_id;
END IF;
END IF;
END;
/

我可以在上面的代码中添加什么来工作,即使我在两个表之间有一个 fk,就像这样:

ALTER TABLE emp_test_lucian
ADD CONSTRAINT fk_dep_id FOREIGN KEY(department_id) REFERENCES dept_test_lucian(department_id);

the current code returns :
Error report:
ORA-00001: unique constraint (C##LABORATOR.SYS_C009994) violated
ORA-06512: at line 2
00001. 00000 - "unique constraint (%s.%s) violated"
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
For Trusted Oracle configured in DBMS MAC mode, you may see
this message if a duplicate entry exists at a different level.
*Action: Either remove the unique restriction or do not insert the key.

最佳答案

您需要明确什么表是“父表”,什么表是“子表”。

在你的例子中:
- 家长:dept_test_lucian
- child :emp_test_lucian

让我们调用“dept_test_lucian”:TableA
让我们调用“emp_test_lucian”:TableB

我得出这个结论是因为 TableB.department_id 上有一个 CONSTRAINT",它只能有一个存在的值在“TableA.department_id”中

错误消息告诉您有一个“正在验证主键”。你表上的主键是:
- “TableA.employee_id”
- "TableB.department_id"

显然,您正试图在这些值已存在的列之一中插入一个值。如果“TableA.employee_id”中已经存在“1”,您将收到此类错误。

我还在你的触发器中看到的是:
您有一个 BEFORE UPDATE 触发器。

因此,触发器会查看“TableA”(父级)是否有更新。
然后你尝试先更新“TableB”( child )。
这可能很棘手,因为“TableB.department_id”只能具有存在于“TableA.department_id”中的值。
如果“TableA.department_id”中不存在新的 UPDATE 值,则无法在“TableB.department_id”中更新该值

关于oracle - 在更新或删除 oracle 中 2 个表之间的 FK 约束后触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27983181/

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