Sql 使用外键删除行时担心递归

Sql 使用外键删除行时担心递归,sql,sql-server,sql-server-2005,tsql,foreign-keys,Sql,Sql Server,Sql Server 2005,Tsql,Foreign Keys,我正在清理一个数据库,里面有很多垃圾记录 它是一个关系结构,有外键将所有东西链接在一起,我设置了一个delete命令: DELETE FROM Members WHERE (CurrentClass = 339) AND (YEAR(LastSessionDate) < 2011) 上表引用了字段JoiningClass、CurrentClass和CurrentScheme上的表Classes和Pricing,然后这些表引用了其他表及其包含的字段,因此基本上所有表都引用了所有表 我想删除

我正在清理一个数据库,里面有很多垃圾记录

它是一个关系结构,有外键将所有东西链接在一起,我设置了一个delete命令:

DELETE FROM Members
WHERE (CurrentClass = 339) AND (YEAR(LastSessionDate) < 2011)
上表引用了字段
JoiningClass、CurrentClass和CurrentScheme
上的表
Classes
Pricing
,然后这些表引用了其他表及其包含的字段,因此基本上所有表都引用了所有表

我想删除上述符合我的条件的记录,但我得到一个外键警告

我曾考虑加上:

ON DELETE CASCADE
但我担心,由于所有内容都引用了其他内容,它将删除所有数据库数据

也就是说,如果我删除上面的记录0,它将删除类
123
999
,这将依次删除其所有引用

这种情况会发生吗?或者我应该更清楚地知道吗?

如果像你说的那样“一切都引用一切”,那么如果不对模式进行认真(读:耗时、烦人)的分析,就很难准确地说出会发生什么。使用第三方工具也是如此——你永远无法100%确定它们会做什么,删除记录也不是你想在生产数据库上冒险做的事情


相反,您应该创建数据库的另一个副本(备份您的架构,然后从另一台服务器上的备份中重新创建),添加级联触发器,看看会发生什么。

我猜JoiningClass和CurrentClass是Members记录的父级。因此,它们不会被删除。当然,您收到的消息表明是另一个具有子记录的表导致删除失败。现在,只有您可以知道这是否是正确的行为,即,如果存在不希望删除记录的子记录,或者是否希望通过级联删除控制所有删除。就个人而言,我从不使用级联删除,因为如果它们是多个子记录(在这种情况下,最好先批量删除它们,然后再删除父表),或者在上述情况下,如果子记录存在,则在任何情况下都不想删除,这会导致性能问题。例如,如果客户的过去订单需要进行正确的财务报告,则您不希望删除该客户,在这种情况下,您会使该客户处于非活动状态,而不是删除


在尝试使用级联删除进行任何删除之前,请确保您有当前备份。

您收到的外键警告是什么?在尝试创建约束时,您可能会收到中描述的错误。@taylonr-
delete语句与引用约束“FK_MissedSessions_Members”冲突。冲突发生在数据库“已审查”、表“dbo.MissedSessions”、列“Member”中。该语句已终止。
ON DELETE CASCADE