将空值解释为任何值的唯一约束

时间:2018-10-26 09:57:27

标签: sql postgresql unique-constraint

考虑表

CREATE TABLE foo
(
    id uuid NOT NULL DEFAULT uuid_generate_v4(),
    col1 integer NOT NULL,
    col2 integer NOT NULL,
    col3 integer
)

我需要检查(col1, col2, col3)的唯一性,其中col3中的NULL表示任何值。也就是说,如果表中有行(1, 2, NULL),将不可能插入包含col1 = 1col2 = 2col3中任何值的行(包括NULL) 。相反,如果表中至少有一行包含col1 = 1col2 = 2的行,并且表col3中有一些不是NULL的值,则不能插入行(1, 2, NULL),但是该行col1 = 1col2 = 2col3中的任何值(NULL除外)都有效。

例如,这些值有效(省略第一个id列):

(1, 2, 3)
(1, 2, 4)
(1, 2, 5)

(1, 2, NULL)
(1, 3, NULL)

但是这些值无效:

(1, 2, NULL)
(1, 2, 3)
(1, 2, 4)

(1, 2, NULL)
(1, 2, NULL)
(1, 2, 3)
(1, 2, 4)

我可以通过PostgreSQL执行此操作吗?我正在使用9.6.5版。

1 个答案:

答案 0 :(得分:0)

在插入之前,请检查是否有行:

col1=your_col1_value 
col2=your_col2_value
col3=null 

如果这样,请勿插入您的行。

使用插入选择:https://www.postgresql.org/docs/current/static/sql-insert.html

并且不存在:https://www.postgresql.org/docs/current/static/functions-subquery.html