依赖于FK的复杂SQL约束

时间:2012-08-09 14:48:50

标签: sql sql-server tsql

基本上我在约束中想要的逻辑是这样的......

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引用/约束。 我得到的错误建议语法错误无论我怎么说这个都有一个例外,当我这样做时......

([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不会让我这样做。 任何想法的家伙?

1 个答案:

答案 0 :(得分: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

这意味着该表中的现有数据不符合您所需的约束。约束在语法上是有效的,或者它不会有这么远。

在实施约束之前,您需要找到错误的数据并进行更正。

E.g。

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)

应该找到不良数据