我试图让多个子句中的一个检查约束,由OR
分隔:一个检查约束中的多个子句?
check (stop>start or stop = NULL)
其中启动和停止都时间戳字段。因此,stop
可以留空,但是如果指定了它,则必须晚于start
。
我完全错了吗?我在时间戳比较中没有发现任何内容,或者在检查约束中允许使用OR
。
这是在postgres 8.4.8。
我试图让多个子句中的一个检查约束,由OR
分隔:一个检查约束中的多个子句?
check (stop>start or stop = NULL)
其中启动和停止都时间戳字段。因此,stop
可以留空,但是如果指定了它,则必须晚于start
。
我完全错了吗?我在时间戳比较中没有发现任何内容,或者在检查约束中允许使用OR
。
这是在postgres 8.4.8。
您应该使用stop IS NULL
而不是stop = NULL
。
这是允许的,但:
stop = NULL
是没有意义的;你的意思是stop IS NULL
。OR stop IS NULL
,因为检查约束只禁止某些内容为“false”,并且如果stop
为空,则stop > start
将为“null”(既不是“真”也不是“假”)。有关检查约束的更多信息,请参阅http://www.postgresql.org/docs/8.4/interactive/ddl-constraints.html。
应该注意的是,如果检查表达式计算结果为真或空值,则检查约束被满足。
是的,但OP希望'stop'是'> start'或'NULL'。 –
@ypercube:对不起,你一定误解了我写的东西?我的观点是'CHECK(stop> start)'等效于'CHECK(停止>开始或停止IS NULL)'。 – ruakh
是的,你是对的,我的误解。 –
啊谢谢,那工作 – Max
你不应该使用'value = NULL',也不'value <> NULL',甚至不要'NULL = NULL'。他们永远不会评价为“真实”。 –
他们都不会评价为“false”;-)他们评估为null。 –