43

重复:何时/为什么在 SQL Server 中使用级联?

我一直不敢使用 DELETE CASCADE,但是随着我变得更加自信(懒惰:D),我在想它有多糟糕,是使用它的最佳做法还是应该避免它并清理我的外键等老式方式(使用存储过程)?

4

2 回答 2

92

ON DELETE CASCADE 很好,但仅当相关行确实是被删除行的逻辑扩展时。例如,DELETE ORDERS 可以删除关联的 ORDER_LINES,因为显然您想删除这个订单,它由一个标题和一些行组成。另一方面,DELETE CUSTOMER 不应删除关联的订单,因为订单本身很重要,它们不仅仅是客户的属性。

思考这个问题的一种方法是:如果我发出 DELETE X 并且它也删除了 Y,我会高​​兴还是不高兴?如果我发出 DELETE X 并被告知“不能删除 X,因为 Y 存在”,我会对保护感到高兴,还是对不便感到恼火?

于 2008-11-10T17:16:21.847 回答
13

我更喜欢准确控制要删除的内容(通过显式声明),所以我通常选择通过存储过程删除,而不是使用级联删除。

于 2008-11-10T16:40:08.737 回答