【发布时间】:2012-03-14 21:22:38
【问题描述】:
我有一个相当简单的检查约束,我想强制两列要么都为 NULL,要么都为 NOT NULL。但是INFORMATION_SCHEMA.CHECK_CONSTRAINTS 没有正确显示此约束。
我基本上想要这个约束:
((Col1 IS NULL AND Col2 IS NULL) OR (Col1 IS NOT NULL AND Col2 IS NOT NULL))
但INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE 显示:
([Col1] IS NULL AND [Col2] IS NULL OR [Col1] IS NOT NULL AND [Col2] IS NOT NULL)
--^ ^ ^ ^
--missing parenthesis
哪个不一样,哪个不正确。
你可以很容易地重现这个......
创建表并检查约束:
CREATE TABLE dbo.MyTest (RowID int identity(1,1) primary key, Col1 int NULL, Col2 int NULL)
ALTER TABLE dbo.MyTest ADD CONSTRAINT CK_MyTest_Cols CHECK ((Col1 IS NULL AND Col2 IS NULL) OR (Col1 IS NOT NULL AND Col2 IS NOT NULL))
显示不正确INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE:
SELECT
c.ORDINAL_POSITION
,cc.CONSTRAINT_NAME
,cc.CHECK_CLAUSE
FROM INFORMATION_SCHEMA.COLUMNS c
LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu ON c.TABLE_CATALOG=cu.TABLE_CATALOG AND c.TABLE_SCHEMA=cu.TABLE_SCHEMA AND c.TABLE_NAME=cu.TABLE_NAME AND c.COLUMN_NAME=cu.COLUMN_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.CHECK_CONSTRAINTS cc ON cu.TABLE_CATALOG=cc.CONSTRAINT_CATALOG AND cu.TABLE_SCHEMA=cc.CONSTRAINT_SCHEMA AND cu.CONSTRAINT_NAME=cc.CONSTRAINT_NAME
WHERE c.TABLE_SCHEMA='dbo' AND c.TABLE_Name='MyTest' AND cc.CONSTRAINT_SCHEMA IS NOT NULL
验证检查约束是否确实按预期工作:
INSERT INTO dbo.MyTest (Col1, Col2) VALUES (NULL,NULL)
INSERT INTO dbo.MyTest (Col1, Col2) VALUES (5,5)
INSERT INTO dbo.MyTest (Col1, Col2) VALUES (5,NULL)
INFORMATION_SCHEMA.CHECK_CONSTRAINTS 怎么了?有什么我做错了或有什么解决方法吗?
在使用检查约束双语框(设计表格时)时,SSMS 也会错误地显示它。它也会错误地编写脚本。但是,当我使用此约束的 SSMS 脚本时,我的测试(上图)中的三个插入仍然可以按预期工作(前两个插入工作,第三个失败)?这似乎与我了解到的关于AND、OR 和parenthesis 的一切相反。怎么回事?
【问题讨论】:
标签: sql-server sql-server-2005 tsql constraints