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 に答える