我花了很多时间试图找出如何实现删除时级联SQL Server 上的递归主键已经有一段时间了。我已经阅读了有关触发器、创建临时表等的内容,但尚未找到适合我的数据库设计的答案。
这是一个用于演示目的的老板/员工数据库示例:
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。
例如,如果 Rick 被解雇,我们会这样做:
DELETE FROM employee WHERE id=7
这应该从员工和信息中删除 Rick 的行。耶级联!
现在,假设我们已经度过了困难时期,我们需要放弃汉密尔顿和他的entire部门。这意味着我们需要删除
- 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,并且它的行为完全符合我的预期。再说一遍,我want如果删除了父母、祖父母、曾祖父母等,则将删除父母的每个可能的孩子、孙子女、曾孙子女等。
当我尝试使用触发器时,我似乎无法让它自行触发(例如,当您尝试删除 Hamilton 的员工 Susan 时,首先查看 Susan 是否有任何员工等),更不用说删除 N 个员工了。
所以!我想我已经提供了我能想到的所有细节。如果还有不清楚的地方,我会尽力改进这个描述。