我已经花了相当多的时间来研究如何在SQL Server上实现针对递归主键的CASCADE ON DELETE。我阅读了有关触发器、创建临时表等方面的内容,但是还没有找到可适用于我的数据库设计的答案。
下面是一个老板/员工数据库示例,供演示使用:
我试过对id/emp_id使用简单的CASCADE ON DELETE,但是SQL Server并不支持它:
我曾在Access的测试数据库中使用了级联删除(CASCADE ON DELETE),并且它完全按照我的预期运行。同样的,我希望在父对象被删除时删除其所有可能的子对象、孙子对象、曾孙对象等。
当我尝试使用触发器时,我似乎无法触发它本身(例如,在尝试删除Hamilton的员工Susan之前,先查看Susan是否有任何员工等),更不用说向下进行N个员工的删除了。
所以!我认为我已经提供了我能想到的每一个细节。如果还有什么不清楚的地方,我会努力改进这个描述。
下面是一个老板/员工数据库示例,供演示使用:
TABLE employee
id|name |boss_id
--|---------|-------
1 |John |1
2 |Hillary |1
3 |Hamilton |1
4 |Scott |2
5 |Susan |2
6 |Seth |2
7 |Rick |5
8 |Rachael |5
如您所见,每个员工都有一个老板,该老板也是一名员工。 因此,在 id/boss_id 上存在 PK/FK 关系。
这是一个(缩略版)带有他们信息的表:
TABLE information
emp_id|street |phone
------|-----------|-----
2 |blah blah |blah
6 |blah blah |blah
7 |blah blah |blah
在 employee.id/information.emp_id 上有一组PK/FK,其操作为CASCADE ON DELETE。
举个例子,如果Rick被解雇了,我们会这样做:
DELETE FROM employee WHERE id=7
这应该从员工和信息表中删除Rick的行。太好了,级联操作!
现在,假设我们遇到了困难时期,需要解雇Hamilton及其整个部门。这意味着我们需要在运行以下命令时从员工和信息表中移除:
- Hamilton
- Scott
- Susan
- Seth
- Rick
- Rachael
DELETE FROM employee WHERE id=3
我试过对id/emp_id使用简单的CASCADE ON DELETE,但是SQL Server并不支持它:
Introducing FOREIGN KEY constraint 'fk_boss_employee' on table 'employee' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
我曾在Access的测试数据库中使用了级联删除(CASCADE ON DELETE),并且它完全按照我的预期运行。同样的,我希望在父对象被删除时删除其所有可能的子对象、孙子对象、曾孙对象等。
当我尝试使用触发器时,我似乎无法触发它本身(例如,在尝试删除Hamilton的员工Susan之前,先查看Susan是否有任何员工等),更不用说向下进行N个员工的删除了。
所以!我认为我已经提供了我能想到的每一个细节。如果还有什么不清楚的地方,我会努力改进这个描述。