2014-01-29 29 views
3

讓我們假設一個表:PostgreSQL的「IS [NOT]不同於」運算符

CREATE TABLE foo (
    id serial primary key 
    , range int4range NOT NULL 
    , barid integer references bar(id) 
    , baz whatever... NOT NULL 
    , EXCLUDE USING gist (range WITH &&, barid WITH =) 
); 

排除約束應該是不允許相同的「barid」值重疊的「範圍」值。但我希望它像其他值一樣對待「NULL」(所以不允許覆蓋範圍爲barid = NULL的不同記錄)。所以給出a = NULL和b = NULL,我想實現「a不是從b」類型的行爲,而不是「a = b」類型(如描述here)。這樣的操作員是否存在?目前我只能通過使用

EXCLUDE USING gist (range WITH &&, COALESCE(barid, -1) WITH =) 

回答

1

a IS NOT DISTINCT FROM b不會使用索引。永遠。

所以不,它不存在。

另外:關係代數中的null表示未定義或未知。它在does not mean no value,因爲在特殊的價值,實際上不是一個因爲不適用。

如果您希望null表示後者,請將其設置爲非空值併爲「無值」項目指定一個特殊值,例如, 0或-1。並將此特殊值添加到您的引用表中。

這樣你就可以使用你現有的約束。