1

我以这种方式创建了一个表(简化):

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的东西。但是为什么允许已经存在的数据不连贯呢?

我想外键是用表中已经存在的数据添加的,但是在添加时,它不应该因为一致性原因而被拒绝吗?

4

1 回答 1

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重新检查并信任表的所有约束)。

于 2013-03-08T08:23:25.163 回答