删除外键约束导致错误

时间:2017-12-25 11:36:32

标签: sql-server foreign-keys

我正在尝试使用此自动创建的脚本创建FK约束。

USE [PRM.Mobile.SaaS]
GO

ALTER TABLE [dbo].[Activity] WITH CHECK 
    ADD CONSTRAINT [FK_Activity_Activity] 
    FOREIGN KEY([ParentActivityID]) REFERENCES [dbo].[Activity] ([ActivityID])
GO

ALTER TABLE [dbo].[Activity] CHECK CONSTRAINT [FK_Activity_Activity]
GO

但是我得到了这些错误:

  

Msg 547,Level 16,State 0,Line 4
  ALTER TABLE语句与FOREIGN KEY SAME TABLE约束“FK_Activity_Activity”冲突。冲突发生在数据库“PRM.Mobile.SaaS”,表“dbo.Activity”,列“ActivityID”中。

     

Msg 4917,Level 16,State 0,Line 8
  约束'FK_Activity_Activity'不存在。

     

Msg 4916,Level 16,State 0,Line 8
  无法启用或禁用约束。查看以前的错误。

看起来非常简单,但我没有任何名称为FK_Activity_Activity的FK。第一条消息是阻止动作的FK约束,第二条消息是该约束不存在,这有点令人困惑。

我仔细检查了INFORMATION.SCHEMAsys.objects,并且没有显示名称为FK_Activity_Activity的内容。

这些是我用来检查的查询

SELECT * 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME LIKE '%Activity_Activity%'

SELECT 
    OBJECT_NAME(object_id) AS ConstraintName,
    SCHEMA_NAME(schema_id) AS SchemaName,
    type_desc AS ConstraintType
FROM 
    sys.objects
WHERE 
    type_desc LIKE '%CONSTRAINT' 
    AND OBJECT_NAME(parent_object_id) = 'Activity'

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

add constraint因第一个错误而失败:未创建FK。

第二个错误来自第二个语句,因为FK不存在。

其他一切都来自那里。

R TABLE [dbo]。[Activity] with CHECK     添加约束[FK_Activity_Activity]     FOREIGN KEY([ParentActivityID])REFERENCES [dbo]。[Activity]([ActivityID])

要解决问题,您可以创建索引,以便更正数据,以便在创建索引之前与新的FK 一致。无论是修改ParentActivityID还是ActivityID中的数据,您都可以说。

但请注意,任何递归结构都需要允许ParentActivityID为空(除非图形是特定的循环)。通常这是通过使其为空。