sql-server - 使用触发器实现参照完整性
问题描述
数据库中有 2 个表,其中包含以下列:
department
具有列的表dept_no
(char(4),不为空)employee
带有列的表dept_no
(char(4), null)
该dept_no
列需要使用触发器定义为表中的主键department
和表中的外键。employee
我认为这是使用删除和插入的虚拟表来更新/删除相应员工表中的外键的正确解决方案:
CREATE TRIGGER trig_delete_dept_no
ON department
AFTER DELETE
AS
UPDATE employee
SET employee.dept_no = NULL
FROM deleted
WHERE employee.dept_no = deleted.dept_no
CREATE TRIGGER trig_update_dept_no
ON department
AFTER UPDATE
AS
UPDATE e
SET e.dept_no = i.dept_no
FROM employee e
INNER JOIN inserted i ON e.dept_no = i.dept_no
但是,当我将部门行更新为不同的值时,我在员工表dept_no
中看不到相应的更新:dept_no
UPDATE department
SET dept_no = 'd4'
WHERE dept_no = 'd3'
按预期删除功能。我对更新触发器做错了什么,如何将这两个触发器组合成一个触发器?
解决方案
你的设计有问题。首先是你不应该使用 dept_no 作为 PK(主键)。您需要有一个 IDENTITY 或 GUID 列作为主键,并将该列称为 FK(外键)。
这样您就无需担心更改 dept_no。
第二点是你不需要触发器。您可以在 DELETE 操作上使用 CASCADE 选项。
推荐阅读
- python - Django 检索不同列值的行
- java - 有一种方法可以用我要求的不同方法来验证 API 响应吗?
- c++ - 填充 unordered_set 的更有效方法?
- python - Python理解递归程序
- firebase - Flutter 文档快照
- css - 徽标在 Chrome 中出现像素化,而不是 Firefox 或 IE
- javascript - 有没有办法从表中获取特定字段的值?
- java - 使用 getBean("myService") 对具有依赖项的类进行单元测试
- javascript - 根据另一个嵌套对象数组的内容过滤对象数组
- asp.net-core-mvc - 如何将主页从索引更改为其他内容?