在 SQL 的检查约束内使用“不在”查询

Posted

技术标签:

【中文标题】在 SQL 的检查约束内使用“不在”查询【英文标题】:Using a 'not in' query inside of a check constraint in SQL 【发布时间】:2021-12-15 08:27:21 【问题描述】:

我有两张桌子,一张是学生桌子,一张是员工桌子:

create table student (
id int not null primary key
)
create table staff (
id int not null primary key
)

我希望每个中的 id 都是唯一的。我知道这在生产中不应该是这样,但我只是想看看为什么我的检查约束不起作用,我正在使用一个更简单的例子来解释。

然后我更改表格以包含以下检查:

alter table student add constraint not_staff check (id not in (select id from staff))
alter table staff add constraint not_student check (id not in (select id from student))

这些检查似乎无效。

我的问题是我们是否可以在检查约束中包含这些类型的 SQL 语句。如果是这样,为什么上述约束无效,我将如何解决它。

谢谢!

【问题讨论】:

创建一个执行检查的用户定义函数,并从表检查约束中调用它。或者,您可以使用数据库触发器。 【参考方案1】:

您不能在 Db2 的检查约束中使用查询。参考CREATE TABLE语句的描述。

CHECK(检查条件) 定义检查约束。表中每一行的搜索条件必须为真或未知。搜索条件 搜索条件有以下限制: ...

搜索条件不能包含以下任何内容 (SQLSTATE 42621): 子查询

实现目标的最简单方法不是创建约束,而是创建一个序列并在两个表的触发器之前使用它。

【讨论】:

以上是关于在 SQL 的检查约束内使用“不在”查询的主要内容,如果未能解决你的问题,请参考以下文章

我将如何添加检查约束以确保日期不在未来

SQL外键约束&&多表查询&&级联删除&&子查询

SQL外键约束&&多表查询&&级联删除&&子查询

SQL外键约束&&多表查询&&级联删除&&子查询

Oracle SQL 检查存在约束

检查约束以确保日期不在未来?