我試圖讓多個子句中的一個檢查約束,由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。 –