我正在尝试使用此自动创建的脚本创建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.SCHEMA
和sys.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'
我在这里缺少什么?
答案 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
为空(除非图形是特定的循环)。通常这是通过使其为空。