我在Postgres中有一个表格,其目前在NOT NULL
列上有email
个约束。此表还有一个phone
列,可选。我希望系统接受一些没有email
的记录,但前提是这些记录的phone
为NOT NULL
。换句话说,我需要一个NOT NULL
数据库约束,以便CREATE
或UPDATE
字段中的email
或phone
字段中的任何一个或两个都成功,NOT NULL
或{{1}}个查询成功本。
进一步扩展以上内容,是否可以在Postgres中指定一组列名,其中一个或多个应该是{{1}},以便成功更新或创建记录?
答案 0 :(得分:8)
答案 1 :(得分:8)
@Igor is quite right和一些OR
'ed表达式快速而简单。
有很长的列列表(a
,b
,c
,d
,e
,f
,{{1}在示例中),这更短,同样快:
g
db<>小提琴here
旧SQL Fiddle。
上述更详细的形式将是:
CHECK (NOT (a,b,c,d,e,f,g) IS NULL)
CHECK (NOT ROW(a,b,c,d,e,f,g) IS NULL)
这里是冗余语法。
仅使用ROW
测试ROW
表达式报告IS NULL
,如果每一列为TRUE
- 恰好是我们想要排除的内容。
不可能简单地使用NULL
反转此表达式,因为这会测试每一列(a,b,c,d,e,f,g) IS NOT NULL
。相反,用IS NOT NULL
否定整个表达式。瞧。
表格形式:
NOT
会实现相同,不那么优雅并且有一个主要限制:仅适用于匹配数据类型的列,而对CHECK (COALESCE(a,b,c,d,e,f,g) IS NOT NULL)
表达式的检查适用于 any < / em> columns。