Sql 一个检查约束中有多个子句?

Sql 一个检查约束中有多个子句?,sql,postgresql,constraints,postgresql-8.4,Sql,Postgresql,Constraints,Postgresql 8.4,我试图在一个检查约束中获得多个子句,由或分隔: check (stop>start or stop = NULL) 其中开始和停止是时间戳字段。因此,stop可以保留为空,但如果指定,则必须晚于start 我完全弄错了吗?我在时间戳比较或检查约束中是否允许或方面没有找到任何内容 这在postgres 8.4.8中。您应该使用stop is NULL,而不是stop=NULL这是允许的,但是: stop=NULL没有意义;您的意思是停止为空 无论如何都不需要指定或stop IS NULL

我试图在一个检查约束中获得多个子句,由
分隔:

check (stop>start or stop = NULL)
其中开始和停止是时间戳字段。因此,
stop
可以保留为空,但如果指定,则必须晚于
start

我完全弄错了吗?我在时间戳比较或检查约束中是否允许
方面没有找到任何内容


这在postgres 8.4.8中。

您应该使用
stop is NULL
,而不是
stop=NULL
这是允许的,但是:

  • stop=NULL
    没有意义;您的意思是
    停止为空
  • 无论如何都不需要指定
    或stop IS NULL
    ,因为检查约束只禁止某些内容为“false”,如果
    stop
    为NULL,则
    stop>start
    将为“NULL”(既不是“true”也不是“false”)
有关检查约束的详细信息,请参见

应该注意,如果check表达式的计算结果为true或null值,则满足check约束


您不应该使用
value=NULL
value-NULL
,甚至不应该使用
NULL=NULL
。它们的计算结果永远不会是
True
。它们的计算结果也不会是
false
;-)它们的计算结果为
null
。是的,但OP希望
stop
>start
null
。@ypercube:对不起,你一定误解了我写的内容?我的观点是
CHECK(stop>start)
相当于
CHECK(stop>start或stop为NULL)