对一组列的NOT NULL约束
我在Postgres中有一个表,它的email
列目前有一个NOT NULL
约束。 该表还具有可选的phone
列。 我希望系统接受一些没有email
logging,但只有当这些logging有NOT NULL
phone
。 换句话说,我需要一个NOT NULL
数据库约束,以便CREATE
或UPDATE
查询在没有任何错误的情况下成功,如果其中一个或两个email
或phone
字段都存在。
进一步扩展上述内容,是否有可能在Postgres中指定一组列名,其中一个或多个应该为NOT NULL
,以便成功更新或创buildlogging?
@Igor是完全正确的 ,一些OR'edexpression式是快速和简单的。
对于列( a
, b
, c
, d
, e
, f
, g
在这个例子中)的长列表来说,这个列更短,速度也更快:
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 NULL
testingROW
expression式只会报告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的列,而检查ROW
expression式适用于任何列。
你可以使用CHECK
约束。 就像是:
CHECK (email is not null OR phone is not null)
有关约束的细节可以在here
find