sql-server - 几个外键和级联删除SQL Server

标签 sql-server foreign-key-relationship sql-delete

enter image description here

在 SQL Server 2014 中,我试图在 3 FK 上添加 CASCADE DELETING。如果我在一个关系中添加一个级联删除,它工作正常。如果我添加更多的级联删除,它将不起作用(循环检测到错误消息)。

在上图中,您可以看到Users 表和Tasks 表(西类牙语为“Tareas”)。所以,我需要完成的是当用户被删除时,我需要将Tasks中标记的字段设置为NULL。

这在数据库中很常见,所以我认为有一种方法可以处理这个问题。

在我的例子中,我的大多数表都有一对字段,其中包含创建或修改记录的用户的 UserId。因此,我需要解决此模式以将其应用于多个地方。

最佳答案

CASCADE DELETE 意味着在您的情况下,如果您删除一个用户,那么 SQL Server 也会删除任何附加的任务。也就是说,将删除整行。除了数据意外丢失、引用完整性丢失或无限递归删除的可能性等问题外,这种行为无论如何都不是您想要的。您已声明您只想将 Tasks 表中的关联用户列标记为空。

作为建议,您是否考虑过实现 TRIGGER ?像这样的东西(还没有测试过,把它当作伪代码!):

CREATE TRIGGER DeleteTareasTrigger
ON Users
BEFORE DELETE AS
BEGIN

UPDATE t
SET t.CreadaPor = NULL
FROM DELETED as d
INNER JOIN Tareas t ON d.UserID = t.CreadaPor

UPDATE t
SET t.ModifcadaPor = NULL
FROM DELETED as d
INNER JOIN Tareas t ON d.UserID = t.ModifcadaPor

END
GO

或者作为另一种方法,在 User 表上添加一个位字段来指示该人是否处于事件状态/已删除状态。

关于sql-server - 几个外键和级联删除SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29585164/

相关文章:

MySQL 跨表删除

Codeigniter 使用连接表删除数据

sql-server - SQL Server 为 float 弥补了额外的精度?

c# - 为什么我的默认值列自动填充日期为 0001 年 1 月 1 日?

c# - 首先附加现有数据库 Entity Framework 代码时出错

entity-framework - Entity Framework 以一对一关联方式保存数据

mysql - 如何界定外键的可能值?

mysql/node.js - 删除不存在的记录时抛出错误

sql - 将内容从 1 个表复制到另一个表(匹配记录除外)

php - 我对两个表的选择无法正常工作