对一组列的NOT NULL约束

我在Postgres中有一个表,它的email列目前有一个NOT NULL约束。 该表还具有可选的phone列。 我希望系统接受一些没有emaillogging,但只有当这些logging有NOT NULL phone 。 换句话说,我需要一个NOT NULL数据库约束,以便CREATEUPDATE查询在没有任何错误的情况下成功,如果其中一个或两个emailphone字段都存在。

进一步扩展上述内容,是否有可能在Postgres中指定一组列名,其中一个或多个应该为NOT NULL ,以便成功更新或创buildlogging?

@Igor是完全正确的 ,一些OR'edexpression式是快速和简单的。

对于列( abcdefg在这个例子中)的长列表来说,这个列更短,速度也更快:

 CHECK (NOT (a,b,c,d,e,f,g) IS NULL) 

SQL小提琴演示。

它是如何工作的?

上面更详细的forms是:

 CHECK (NOT ROW(a,b,c,d,e,f,g) IS NULL) 

ROW在这里是冗余语法。

使用IS NULLtestingROWexpression式只会报告TRUE如果每一列都是NULL – 这正好是我们要排除的。

(a,b,c,d,e,f,g) IS NOT NULL是不可能的,因为这会testing每一列IS NOT NULL 。 相反,用NOT否定整个expression式。 瞧。

手册的更多细节在这里和这里 。

一个expression式的forms:

 CHECK (COALESCE(a,b,c,d,e,f,g) IS NOT NULL) 

会达到相同,不太优雅,并有一个主要的限制:只适用于匹配数据types的列,而检查ROWexpression式适用于任何列。

你可以使用CHECK约束。 就像是:

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

有关约束的细节可以在herefind