我有一个相当简单的检查约束,我想强制两列既是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
的内容是什么?并且有什么我做错了或为此做任何解决方法吗?
当使用check constraints duologue框(设计表格时)时,SSMS也会错误地显示它。它也会错误地编写脚本。但是,当我使用此约束的SSMS脚本时,我的测试中的三个插入(上面)仍然可以按预期工作(前两个插入工作,第三个插入失败)?这似乎与我从AND
,OR
和parenthesis
学到的所有内容相悖。发生了什么事?
答案 0 :(得分:2)
他们是一样的。见Logical Operator Precedence
如果在语句中使用了多个逻辑运算符,则为NOT 首先评估,然后评估AND,最后评估OR。
And
的优先级高于OR
,因此括号是可选的 - 与乘法的优先级高于加法相同,所以
SELECT 1 * 1 + 3 * 3
与
相同SELECT (1 * 1) + (3 * 3)