我有一个以这种方式创建的表格(简化):
CREATE TABLE [dbo].[values](
[id] [uniqueidentifier] NOT NULL,
[parentId] [uniqueidentifier] NULL
)
ALTER TABLE [dbo].[values] ADD CONSTRAINT [x] FOREIGN KEY([parentId])
REFERENCES [dbo].[values] ([id])
此表包含3000行。
如果我执行以下查询:
SELECT *
FROM values
WHERE parentId IS NOT NULL
AND parentId NOT IN (SELECT id FROM values)
我得到800个结果。
这怎么可能?
插入数据时,外键有效,我无法插入任何在表中找不到的parentId。但为什么已经存在的数据被允许不连贯?
我认为外键已经添加了表中已有的数据,但是在添加它时,是否应该因为一致性原因而被拒绝?
答案 0 :(得分:2)
是否使用BULK INSERT
或其他未检查约束的方式插入数据?如果是这样,出于性能原因可能已允许数据通过,并且您可能有不受信任的约束。
您可以使用以下查询查看所有不受信任的约束:
SELECT name, OBJECT_NAME(parent_object_id) AS TableName,
OBJECT_NAME(referenced_object_id) AS ReferencedTableName
FROM sys.foreign_keys
WHERE is_not_trusted = 1
批量插入后,您需要使用ALTER TABLE [values] WITH CHECK CHECK CONSTRAINT [x]
手动重新检查并信任约束(或ALTER TABLE [values] WITH CHECK CHECK CONSTRAINT ALL
重新检查并信任该表的所有约束。)