【发布时间】:2014-09-05 21:53:45
【问题描述】:
一段时间以来,我花了很多时间试图弄清楚如何为 SQL Server 上的递归主键实现 CASCADE ON DELETE。我已经阅读了有关触发器、创建临时表等的内容,但尚未找到适合我的数据库设计的答案。
这是一个用于演示目的的 Boss/Employee 数据库示例:
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 上有一个带有 CASCADE ON DELETE 的 PK/FK。
例如,如果 Rick 被解雇,我们会这样做:
DELETE FROM employee WHERE id=7
这应该从员工和信息中删除 Rick 的行。耶级联!
现在,假设我们经历了艰难时期,我们需要让汉密尔顿和他的整个部门休息。这意味着我们需要删除
- 汉密尔顿
- 斯科特
- 苏珊
- 赛斯
- 瑞克
- 瑞秋
我们运行时从员工表和信息表中:
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 个员工。
所以!我想我已经提供了我能想到的每一个细节。如果还有什么不清楚的地方,我会尝试改进这个描述。
【问题讨论】:
标签: sql sql-server recursion constraints cascade