由于模糊冲突,无法添加外键约束

时间:2014-08-26 11:46:36

标签: sql sql-server foreign-keys constraints conflict

尝试运行:

ALTER TABLE [dbo].[Table1] ADD
CONSTRAINT [FK_Table1_ScenarioResult] 
FOREIGN KEY ([ScenarioResultID]) REFERENCES [dbo].[ScenarioResult] ([ScenarioResultID]) ON DELETE CASCADE

出现此错误:

消息547,级别16,状态0,第1行 ALTER TABLE语句与FOREIGN KEY约束“FK_Table1_ScenarioResult”冲突。冲突发生在数据库“8362”,表“dbo.ScenarioResult”,列'ScenarioResultID'。

我查了一下:

  • 约束不存在,同一列
  • 上不存在其他约束
  • 列中的值在两个表中匹配
  • 列的类型相同
  • 尝试了不同的名字,也失败了

SQL Server 2008 R2

我能尝试什么想法?

3 个答案:

答案 0 :(得分:7)

理论上这可能有用:

ALTER TABLE [dbo].[Table1] WITH NOCHECK ADD
CONSTRAINT [FK_Table1_ScenarioResult] 
FOREIGN KEY ([ScenarioResultID]) REFERENCES [dbo].[ScenarioResult] ([ScenarioResultID]) 
ON DELETE CASCADE

不确定如何检查现有值的完整性,但应该是:

SELECT COUNT(*) as Orphans FROM [dbo].[Table1] t 
WHERE NOT EXISTS 
  (SELECT * FROM [dbo].[ScenarioResult] WHERE ScenarioResultID = t.ScenarioResultID)

如果"孤儿"如果大于零则需要在添加约束之前清理数据。

答案 1 :(得分:0)

这个令我感到困惑,然后便士掉了下来。

我正在尝试使用"数据库图表"创建外键。在SQL Server 2012中,它拒绝让我声称与我试图创建的外键冲突。嗯?

但是,我接受了默认值" 强制执行外键约束"。但是我已经在我试图创建外键的两个表中有数据了,它打破了我试图制作的外键规则,因此SQL Server拒绝了新密钥。

解决方案(在这种特殊情况下)是改变" 强制执行外键约束"至" ",或至少在我清理数据之前。

希望这有帮助。

答案 2 :(得分:0)

我有同样的问题 我清除了要在其中编辑内容的表的数据,并添加了新的外键约束并重试。 这个对我有用。 希望对您有帮助。