【问题标题】:Simple check constraint not showing up properly in INFORMATION_SCHEMA.CHECK_CONSTRAINTS简单检查约束未在 INFORMATION_SCHEMA.CHECK_CONSTRAINTS 中正确显示
【发布时间】: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 脚本时,我的测试(上图)中的三个插入仍然可以按预期工作(前两个插入工作,第三个失败)?这似乎与我了解到的关于ANDORparenthesis 的一切相反。怎么回事?

【问题讨论】:

    标签: sql-server sql-server-2005 tsql constraints


    【解决方案1】:

    它们是一样的。见Logical Operator Precedence

    当一个语句中使用多个逻辑运算符时,NOT 是 首先求值,然后是 AND,最后是 OR。

    And 的优先级高于 OR,因此括号是可选的 - 就像乘法的优先级高于加法一样

    SELECT 1 * 1 + 3 * 3 
    

    一样
    SELECT (1 * 1) + (3 * 3)
    

    【讨论】:

    • 我认为ANDOR 的优先级相同,猜不出来
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    相关资源
    最近更新 更多