0

基本的に、制約で必要なロジックは次のようになります...

IF([AssetTypeId] = 1) 
THEN
    [FileId] IS NOT NULL AND [Url] IS NULL 
END

IF([AssetTypeId] = 0) 
THEN
   [FileId] IS NULL AND [Url] IS NOT NULL)
END

AssetTypeId は、現在のテーブルの FK 参照/制約です。私がこれを行うとき、私が得るエラーは、1つの例外を除いてこれをどのように表現するかに関係なく、構文エラーを示唆しています...

([AssetTypeId] = 1) AND [FileId] IS NOT NULL AND [Url] IS NULL 
OR
([AssetTypeId] = 0)  AND [FileId] IS NULL AND [Url] IS NOT NULL

それは私にこのエラーを与えます:

'Asset (dbo)' table
- Unable to add constraint 'CK_Asset_FileIdOrUrlRequiredNotBoth'.  
The ALTER TABLE statement conflicted with the CHECK constraint "CK_Asset_FileIdOrUrlRequiredNotBoth". The conflict occurred in database "MyDb", table

「dbo.Asset」。

なぜSQLがこれをさせてくれないのか理解できないようです。アイデアはありますか?

4

1 に答える 1

2

制約の作成中にメッセージが、同じ制約に違反していることを示している場合:

'Asset (dbo)' table
- Unable to add constraint 'CK_Asset_FileIdOrUrlRequiredNotBoth'.  
The ALTER TABLE statement conflicted with the CHECK constraint "CK_Asset_FileIdOrUrlRequiredNotBoth". The conflict occurred in database "MyDb", table

これは、そのテーブルに目的の制約に準拠していない既存のデータがあることを意味します。制約は構文的に有効です。そうでない場合は、ここまで到達していません。

制約を実装する前に、不良データを見つけて修正する必要があります。

例えば

SELECT * from Asset where
([AssetTypeId] = 1) AND ([FileId] IS NULL OR [Url] IS NOT NULL )
OR
([AssetTypeId] = 0)  AND ([FileId] IS NOT NULL OR [Url] IS NULL)

悪いデータを見つける必要があります

于 2012-08-09T14:52:29.950 に答える