外键允许引用字段中不存在的值

时间:2013-03-08 08:16:22

标签: sql sql-server foreign-keys

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

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

我认为外键已经添加了表中已有的数据,但是在添加它时,是否应该因为一致性原因而被拒绝?

1 个答案:

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