对一组列的NOT NULL约束

时间:2014-01-09 13:04:18

标签: sql database postgresql constraints postgresql-9.2

我在Postgres中有一个表格,其目前在NOT NULL列上有email个约束。此表还有一个phone列,可选。我希望系统接受一些没有email的记录,但前提是这些记录的phoneNOT NULL。换句话说,我需要一个NOT NULL数据库约束,以便CREATEUPDATE字段中的emailphone字段中的任何一个或两个都成功,NOT NULL或{{1}}个查询成功本。

进一步扩展以上内容,是否可以在Postgres中指定一组列名,其中一个或多个应该是{{1}},以便成功更新或创建记录?

2 个答案:

答案 0 :(得分:8)

您可以使用CHECK约束。 类似的东西:

CHECK (email is not null OR phone is not null)

可以找到有关约束的详细信息here

答案 1 :(得分:8)

@Igor is quite right和一些OR'ed表达式快速而简单。

有很长的列列表(abcdef,{{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否定整个表达式。瞧。

手册herehere中的详细信息。

表格形式:

NOT

会实现相同,不那么优雅并且有一个主要限制:仅适用于匹配数据类型的列,而对CHECK (COALESCE(a,b,c,d,e,f,g) IS NOT NULL) 表达式的检查适用于 any < / em> columns。