为啥我不能使用引用 SQL 中其他列的 checkConstraint 将列添加到现有表

Posted

技术标签:

【中文标题】为啥我不能使用引用 SQL 中其他列的 checkConstraint 将列添加到现有表【英文标题】:Why can't I add a column to an existing table with a checkConstraint that references other columns in SQL为什么我不能使用引用 SQL 中其他列的 checkConstraint 将列添加到现有表 【发布时间】:2022-01-13 20:04:10 【问题描述】:

我正在使用 SQL Server 并尝试添加列和检查约束。我发现以下工作:

ALTER TABLE table.column
    ADD isTrue BIT

GO
ALTER TABLE table.column
    ADD CONSTRAINT CK_table_isTrue CHECK ((isTrue = 1 AND column1 = 0 AND column2 = 0 AND column3 IS NULL) OR isTrue = 0)

但是,一种不那么冗长的写法是行不通的:

ALTER TABLE table.column
    ADD isTrue BIT
    CONSTRAINT CK_table_isTrue CHECK ((isTrue = 1 AND column1 = 0 AND column2 = 0 AND column3 IS NULL) OR isTrue = 0)

输出如下错误:

列 'isTrue' 的列 CHECK 约束引用另一列,表 'table'。

查看文档,所以我无法确定为什么会这样

【问题讨论】:

什么是“不起作用”。意思是?你有错误吗?如果是这样,错误是什么? 将编辑上面的问题!但错误如下:`列'isTrue'的列CHECK约束引用另一列,表'table'。` 【参考方案1】:

您的语法不太正确。引用多列的约束是表约束。您正在尝试添加表约束,因此在 isTrue 的数据类型定义后需要一个逗号。

ALTER TABLE table.column
    ADD isTrue BIT,
    CONSTRAINT CK_table_isTrue CHECK ((isTrue = 1 AND column1 = 0 AND column2 = 0 AND column3 IS NULL) OR isTrue = 0);

如果没有逗号,SQL Server 会认为您正在尝试添加列约束,因此会出现您引用不同列的错误。

【讨论】:

以上是关于为啥我不能使用引用 SQL 中其他列的 checkConstraint 将列添加到现有表的主要内容,如果未能解决你的问题,请参考以下文章

ERROR列的CHECK约束引用另一列

为啥不能在 C# 中删除未使用的引用

为啥我不能在计算列的 case 语句中使用子查询

SQL CHECK 约束:使用方法及撤销方法剖析

SQL CHECK 约束

SQL server中某个表的字段值为啥不能修改?