在删除级联上正在删除整个子表
Posted
技术标签:
【中文标题】在删除级联上正在删除整个子表【英文标题】:on delete cascade is deleting entire child table 【发布时间】:2010-11-12 17:52:05 【问题描述】:我有两张桌子: Parent,它有一个主键(parentID)和一些其他类型为 varchar(50) 和 Child 的字段,如下所示:
childID, primary key
parentID, foreign key references Parent (parentID)
otherID, foreign key to another table
如果我从 Child 中删除一行,没问题。
如果我从 Parent 中删除一行,我会在 Child 上收到外键约束错误 - 很好,没错。
现在,我修改 parentID 键的关系并将删除设置为级联而不是无操作 (我使用的是 2008 服务器工作室,右键单击列,选择修改,然后右键单击表设计并选择关系。然后我选择父/子表的关系并打开下面的插入/更新规范部分表设计器)
如果我从 Child 中删除一行,同样没有问题。 如果我从 Parent 中删除一行,子表的所有行都会被删除,即使它们中的大多数都指向其他 parentID。
我继承了这个数据库及其所有表。我缺少一些属性设置吗?根据我的阅读,级联删除应该只删除指向我从 Parent 中删除的单个 parentID 的子行。
谢谢。
本
【问题讨论】:
是的,级联删除只会删除与父级关联的子行。我最好的猜测是您没有正确定义级联删除。再检查一遍。 【参考方案1】:对,删除应该只删除与已删除“父级”相关的行。
查看级联删除设置,并查找可能写入错误的触发器。
【讨论】:
触发器的优点。而且我个人不赞成在级联删除上使用。 就是这样,谢谢!有一个触发器函数,它本身没有做任何事情,但与级联删除一起清理表。 @ben:NP。 @HLGEM:我同意——级联删除(通常)是个坏主意。我认为在某些情况下它们也不起作用。【参考方案2】:尝试设置 SetNull 而不是 cascade,这会导致将您的子表列(父表的键退出的位置)设置为 NULL。
【讨论】:
以上是关于在删除级联上正在删除整个子表的主要内容,如果未能解决你的问题,请参考以下文章