【问题标题】:SQL Server error creating a foreign key constraintSQL Server 错误创建外键约束
【发布时间】:2014-10-31 12:38:01
【问题描述】:

我正在尝试重新创建最近被删除的外键约束,而 SQL Server 不允许我这样做。这是 SQL Server Management Studio 给我的 DDL:

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.CleansingOperations SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.CleansedData ADD CONSTRAINT
    FK_CleansedData_CleansingOperations FOREIGN KEY
    (
    CleansedOperationID
    ) REFERENCES dbo.CleansingOperations
    (
    CleansingOperationID
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION 

GO
ALTER TABLE dbo.CleansedData SET (LOCK_ESCALATION = TABLE)
GO
COMMIT

这是我运行它时遇到的错误:

消息 547,第 16 级,状态 0,第 1 行
ALTER TABLE 语句与 FOREIGN KEY 约束“FK_CleansedData_CleansingOperations”冲突。冲突发生在数据库“NetVis203”、表“dbo.CleansingOperations”、列“CleansingOperationID”中。

消息 3902,第 16 级,状态 1,第 1 行
COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。

这一切是什么意思?据我所知,这是说约束与自身“冲突”!

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    这意味着 CleansedData 中有一行在 CleansingOperations 中没有对应的行

    SELECT CleansingOperationId FROM dbo.CleansedData
    EXCEPT
    SELECT CleansingOperationId FROM dbo.CleansingOperations
    

    应该不返回任何行以使您的语句正常工作。

    有一个 NOCHECK 关键字可以绕过错误,但更好地了解哪些行会违反外键。

    错误消息的原因是 SQL Server 假设外键已就位,然后在提交语句之前断言所有行都满足约束。第二条错误消息的原因与错误处理有关(我也永远无法正确处理)。

    【讨论】:

    • 太好了,这已经向我解释了,并给了我足够的修复它。干杯。