【问题标题】:Adding foreign key fails unless data is first removed and reinserted after添加外键失败,除非先删除数据并在之后重新插入
【发布时间】:2016-10-19 22:21:51
【问题描述】:

我对外键有一个奇怪的问题。我正在尝试执行以下查询:

ALTER TABLE [GroupMember] FOREIGN KEY ([Group]) REFERENCES [Group]([GUID])

这给了我以下错误:

ALTER TABLE 语句与 FOREIGN KEY 约束“FK__GroupMember__Group__0D25C822”冲突。冲突发生在数据库“x”、表“dbo.Group”、列“GUID”中。

然后我验证了现有的东西,我已经确认一切正常:

  • 引用的表 (dbo.Group) 在 [GUID] 列上有一个已定义的主键
  • 引用表 (dbo.GroupMember) 没有 [Group] 值,这些值在 dbo.Group-table 的 [GUID] 列中不存在
  • 不存在类似的引用外键

从这里开始,我进行了实验。取一些行进出,擦拭表格,截断表格。到目前为止我可以得出的结论:

  • 如果我使用 DELETE FROM [GroupMember]; 擦除引用表然后尝试应用 FK 约束,我会收到相同的错误消息
  • 如果我使用TRUNCATE TABLE [GroupMember]; 截断引用表,我可以应用FK 约束而不会出错。此外,我可以在应用 FK 约束后重新插入完全相同的数据,而不会出现问题。

由此我可以得出结论,数据本身不是问题。任何人都可以理解这一点吗?为什么我可以在截断表后应用约束,但在删除所有记录后不能应用约束?

【问题讨论】:

  • 您是否尝试将WITH NOCHECK 选项与alter table 语句一起使用?
  • 嘿托德。如果我使用 NOCHECK 提示添加约束,它会起作用。
  • 您的列是否允许 NULL 值?
  • 嗨,Woozar。引用列是可为空的,被引用列是具有聚集 PK 的不可为空列。我已经尝试删除所有带有 NULL 的引用列,但它没有帮助。

标签: sql constraints sql-server-2016


【解决方案1】:

如果您使用的是 Microsoft SSMS,请检查取消选中“防止保存需要重新创建表的更改”是否可以解决问题。您可以在选项 > 设计器 > 表和数据库设计器中找到它。

我遇到过类似的问题,已通过此方法解决。让我知道它是否有效。

祝你好运。

【讨论】:

  • 您好,感谢您的回复。我过去也遇到过这个选项的问题,所以它已经禁用了一段时间,我现在仔细检查了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
相关资源
最近更新 更多