我想了解触发器更新前的内容。
我有一个名为DEPT_MST
的表,其中DEPT_ID
是主键。它有2行,DEPT_ID
1和2。
另一个表EMP
将列EMP_ID
作为主键,EMP_DEPT_ID
是引用DEPT_ID
表的DEPT
的外键。
现在,如果我在EMP
表EMP_DEPT_ID
列之前添加更新触发器,这将检查主表EMP_DEPT_ID
中是否存在DEPT
的新值,如果现在将插入新行DEPT_ID
到DEPT
表的新行。
现在,如果我将EMP_DEPT_ID
更新为3,EMP_DEPT_ID
表中的EMP
为2,则表示未找到父级的完整性约束违规错误。
所以,
谢谢
答案 0 :(得分:1)
在调用触发器之前评估非延迟外键约束,是。
如果您可以声明外键约束是可延迟的(如果现有约束不可延迟,则需要删除并重新创建它)
ALTER TABLE emp
ADD CONSTRAINT fk_emp_dept (emp_dept_id) REFERENCES dept( dept_id )
INITIALLY DEFERRED DEFERRABLE;
在您的应用程序中,您可以将约束设置为可延迟,运行导致触发器触发的INSERT
语句并插入父行。当事务提交时,将验证您的外键约束。
将约束定义为可延迟的替代方法是将emp
表重命名为emp_base
,创建名为emp
的视图,然后创建instead of insert
触发emp
,实现首先插入dept
然后插入emp_base
的逻辑。