1

以下のように、ProductType と ProductSizeGroup の 2 つのテーブルがあるとします。

製品タイプ

Id 
Name
MaleSizeGroupId
FemaleSizeGroupId
ChildSizeGroupId

商品サイズグループ

Id
Name

MaleSizeGroupId、FemaleSizeGroupId、ChildSizeGroupId の各フィールドは、ProductSizeGroup.Id の FK である必要があります。

次のステートメントを使用して追加します。

ALTER TABLE [dbo].[ProductType]  
WITH CHECK ADD CONSTRAINT
    [FK_ProductType_ProductSizeGroup_Male] FOREIGN KEY([MaleGroupId]) 
    REFERENCES [dbo].[ProductSizeGroup] ([Id])

これはうまくいきます。次を使用して追加しようとします

ALTER TABLE [dbo].[ProductType]
WITH CHECK ADD CONSTRAINT
    [FK_ProductType_ProductSizeGroup_Female] FOREIGN KEY([FemaleGroupId]) 
    REFERENCES [dbo].[ProductSizeGroup] ([Id])

しかし、私はエラーが発生します:

ALTER TABLE ステートメントが FOREIGN KEY 制約 "FK_ProductType_ProductSizeGroup_Female" と競合しました。データベース「dbname」、テーブル「dbo.ProductSizeGroup」、列「Id」で競合が発生しました。

ですから、対立があります..しかし、どのような対立ですか?何を探すべきですか?

4

1 に答える 1

2

つまり、参照先のテーブル ( ) に存在しないProductTypeの値を持つテーブルの行があることを意味します。FemaleGroupIdProductSizeGroup

それ自体は問題ではありません。あるテーブルから別のテーブルに移動する複数の列を完全に持つことができます。

問題は既存のデータにあります - その FK 制約に対応していないデータがそこにあります。そのデータを修正すれば、問題ないはずです。

これらの問題のある行を見つけるには、次のようなクエリを使用します。

SELECT * 
FROM [dbo].[ProductType]
WHERE FemaleGroupId NOT IN (SELECT DISTINCT Id FROM [dbo].[ProductSizeGroup])

これにより、問題のあるすべての行がリストされます - それらの属性を更新して、もう一度やり直してください!

于 2012-04-14T18:11:51.830 に答える