首页 > 解决方案 > 使用触发器实现参照完整性

问题描述

数据库中有 2 个表,其中包含以下列:

  1. department具有列的表dept_no(char(4),不为空)
  2. 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'

按预期删除功能。我对更新触发器做错了什么,如何将这两个触发器组合成一个触发器?

标签: sql-server

解决方案


你的设计有问题。首先是你不应该使用 dept_no 作为 PK(主键)。您需要有一个 IDENTITY 或 GUID 列作为主键,并将该列称为 FK(外键)。

这样您就无需担心更改 dept_no。

第二点是你不需要触发器。您可以在 DELETE 操作上使用 CASCADE 选项。

查找有关 CASCADE 的更多信息


推荐阅读