为啥我不能使用引用 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 将列添加到现有表的主要内容,如果未能解决你的问题,请参考以下文章