[英]how do you enforce conditional not null check across sql columns
create table A (id, col_A, col_B, col_C)
id = 被持久化的每一行的唯一 id col_A或col_B 将具有有效值,但两列不会同时为每个持久化行具有值。
例如
insert into A (id, col_A, col_C) values (1, "a", "c")
insert into A (id, col_B, col_C) values (1, "b", "c")
insert into A (id, col_A, col_C) values (1, "aa", "cc")
insert into A (id, col_B, col_C) values (1, "bb", "cc")
注意:根据设计,col_A 和 col_B 不能合并为单个列。
我想根据上述限制对 col_A 和 col_B 强制执行条件非空检查(即,对于每一行,至少应存在 col_A 或 col_B)。 我如何做到这一点?
编辑:
您需要定义一个表级检查约束。 以下使用 Oracle 语法,但大多数 DBMS 产品将具有非常相似的内容....
alter table A add constraint a_or_b
check (
( a is not null and b is null )
or
( a is null and b is not null )
)
/
编辑
为了回应你的评论,我想这会是
@org.hibernate.annotations.Check(
constraints = “(a is not null and b is null) or (a is null and b is not null)”
)
但作为数据建模师和 DBA,这确实是我希望在数据库中强制执行的那种事情。 我不认为在不同风格的 RDBMS 中,语法真的不会有太大变化,如果有的话。
您可以使用约束来检查 col_a 不为空或 col_b 不为空。 如果两列都为空或者两列都不为空,这会给你一个错误。 它只允许带有 a 或 b 的记录。
在 SQL Server 中会像:
ALTER TABLE [dbo].[A]
WITH CHECK ADD CONSTRAINT [CK_test]
CHECK (([col_a] IS NOT NULL and [col_b] IS NULL)
or ([col_a] IS NULL and [col_b] IS NOT NULL)
)
触发器。 由于您尚未指定哪个数据库,因此很难给出更详细的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.