sql - MS SQL "ON DELETE CASCADE"多个外键指向同一个表?

标签 sql sql-server foreign-keys constraints cascading-deletes

我有一个问题,我需要对指向同一个表的多个外键进行级联..

[Insights]
| ID | Title        |
| 1  | Monty Python |
| 2  | Spamalot     | 

[BroaderInsights_Insights]
| broaderinsight_id | insight_id |
| 1                 | 2          |

基本上,当删除见解表中的一或两条记录时,我需要也删除该关系..

我已经尝试过这个:

 CREATE TABLE broader_insights_insights(id INT NOT NULL IDENTITY(1,1),
   broader_insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
   insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
   PRIMARY KEY(id))
Go

This results in the warning that the cascade "may cause cycles or multiple cascade path"

所以我尝试仅向insight_id添加级联,结果是:

The DELETE statement conflicted with the REFERENCE constraint

有什么想法吗?

谢谢

丹尼尔

最佳答案

您必须将其实现为见解的删除触发器,而不是删除触发器,才能使其正常工作。像这样的东西:

create trigger T_Insights_D
on Insights
instead of delete
as
    set nocount on
    delete from broader_insights_insights
    where insight_id in (select ID from deleted) or
    broader_insight_id in (select ID from deleted)

    delete from Insights where ID in (select ID from deleted)
<小时/>

经常使用级联删除和大量外键,您需要花时间制定“级联”顺序,以便发生在“树”顶部的删除成功级联到引用表。但在本例中这是不可能的。

关于sql - MS SQL "ON DELETE CASCADE"多个外键指向同一个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018099/

相关文章:

sql - 如何使用一个 SQL 查询从数据库中删除所有表?

mysql - 外键关系的最佳实践

mysql - 从带有外键的表中删除

django - Django-MPTT 树的外键在管理内联中生成 SQL 请求 Storm

MySQL 子查询返回多行并出错

asp.net - ASP.NET 应用程序指向错误数据库的问题

sql-server - SQL Server Express 和 Enterprise 如何对话?

Mysql ORDER BY 和 LIMIT 慢查询

mysql - 带有别名的复杂 SQL 查询

c# - 如何在 HQL 中使用 DATEPART 从 DATETIME 获取 YEAR