Ram*_*esh 14 sql-server-2008 sql-server delete sql-server-2008-r2
在 SQL Server 2008 中,有一个主表,它通过一对多关系链接到其他三个子表。所以,我们想在主表中使用级联删除,这样当从主表中删除记录时,子表上的所有记录都会被删除。
Dav*_*ett 19
我通常对通过触发器或ON <something> CASCADE
. 这样的设施非常强大,但也有潜在的危险。
- 那么,这里的级联删除是一个正确的选择吗?
它肯定会做您想要做的事情:在删除父记录时删除相关记录,而无需实现任何其他逻辑以确保首先删除子记录,从而使您的代码更加简洁。所有操作都将包含在一个隐式事务中,因此如果某些内容阻塞,则子项删除整个操作将被阻塞,只需很少或无需额外的编码工作即可保持参照完整性。
确保您对级联删除和其他“幕后”操作的使用有详细记录,以便系统的未来维护人员充分了解它。
- 什么时候不应该使用级联detele?
如果你像我一样偏执,就不应该使用它!需要考虑的一个关键点是目前或将来可能在您的代码/数据库上工作的其他开发人员(因此上面关于记录任何“隐藏”行为的评论)。
根据我的经验,没有经验的人使用DELETE
然后重新INSERT
更新行是很常见的,尤其是当他们真正想要的是MERGE
/UPSERT
操作时(更新现有行并在具有给定键的行不存在的情况下创建新行)并且 DBMS 不支持合并/更新插入(或者他们不知道它的支持)。如果没有级联操作,这是完全安全的(或者在威胁数据完整性时会出错)但是如果有人对父表中引用 FK 的行执行此操作ON DELETE CASCADE
设置然后相关数据将作为初始删除的结果被删除而不是被替换 - 因此数据丢失(即使删除和后续插入包含在显式事务中,级联也会发生在删除操作中 - 它不会等待看事务是否在后续语句中替换了父表中的行)并且级联可以通过其他关系继续(例如:删除高级主管,他的团队被级联删除,他的团队被级联删除,所有这些人的所有跟踪记录都被级联删除,......)。如果不启用级联,您只会在此处收到错误信息,而不是数据会悄悄丢失。
我想答案归结为对您的情况是否有意义,这取决于。对于您的情况,如果“子”表中的相应“主”行消失,那么保留“子”表中的行是否有意义?如果没有父表,子表中的数据是否毫无意义?如果是这样,那么级联删除将强制执行参照完整性。您可能希望将子行保留为记录,即过去活动的存档(尽管您可能出于此目的将这些行写入另一个表)。
我用来说明这一点的一个例子是医患关系。一个医生可以有很多病人。病人只有在有医生的情况下才能成为病人。如果医生离开(离开实践),那么剩下的病人就会发生一些事情。一种可能性是它们被清除了。另一个是默认值替换文档引用,或者它们可以从主表中删除并放置在其他地方。或者,没有活动发生,患者保持原样,未受影响,就好像医生仍然在场一样。这取决于你想做什么。
从个人经验出发仔细考虑数据库的设计。本周,我不得不清除一张表中的孤立记录,该表无处可去,而且确实占用了空间。
归档时间: |
|
查看次数: |
15848 次 |
最近记录: |