考虑表
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 = 1
,col2 = 2
和col3
中任何值的行(包括NULL) 。相反,如果表中至少有一行包含col1 = 1
和col2 = 2
的行,并且表col3
中有一些不是NULL的值,则不能插入行(1, 2, NULL)
,但是该行col1 = 1
,col2 = 2
和col3
中的任何值(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版。
答案 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