1

我看到了有关该主题的答案,但与我的不完全一样。

我在设计器中使用 EF1 创建了一个数据库模式。我在 2 个表(EntityAEntityB)之间添加了关系一或零到多。接下来,我将一条记录添加到表 EntityA 中,并将一条记录添加到 EntityB 中,该记录具有 EntityA 记录的 id。正如我在设计模式(在 MS SMS 中)看到的字段 EntityA_id(在表 EntityB 中)设置为 ALLOW NULL,我试图删除表 EntityA 中的记录。

我预计该记录将被删除,并且表 EntityB 中的字段 EntityA_id 将自动设置为 NULL。不幸的是,我遇到了异常:DELETE 语句与 REFERENCE 约束“FK_EntityAEntityB”冲突

如果将具有外键的字段设置为 ALLOW NULL,为什么会抛出异常?

4

1 回答 1

0

如果将具有外键的字段设置为 ALLOW NULL,为什么会抛出异常?

引发异常的原因是您尝试执行的操作会影响整个 row,而不仅仅是可为空的列。将子表中的列设置为允许null规定该列允许没有值。除非 RDBMS 明确规定,否则可为空的列与引用完整性约束(如外键)无关;这意味着无论设置了任何特定于列的规则,外键规则仍然会生效。外键规则规定,如果父行在子表中有子行,则不能删除它。这样做将呈现所有子记录孤儿。我们现在不想让任何人成为孤儿吧?

外键向您保证的是,不会在子表中的外键列中插入/删除任何值,而不引用父表的键列中的有效值,如下所示相反,不能删除任何父行(除非ON DELETE子句已指定),如果相关表中有任何子行。

MSSQL(我假设您正在使用)中空外键列的规则规定外键列允许包含空值。这就是你可能需要做的事情才能实现这一目标。将列值设置为NULL,然后尝试删除。

与此无关,您可能对此感兴趣

于 2012-11-02T05:19:12.533 回答