2
所以我有一個表類似的結構:試圖UPSERT一個表部分索引
CREATE TABLE x (
id SERIAL,
a character varying(1024) NOT NULL,
b character varying(2048),
c character varying(1024)
);
CREATE UNIQUE INDEX uniq_x_a ON x USING btree (a) WHERE (b IS NULL);
CREATE UNIQUE INDEX uniq_x_a_b ON x USING btree (a, b) WHERE (b IS NOT NULL);
現在我升級這種情況下,以9.5和要使用的ON CONFLICT DO UPDATE
。
所以執行這個
INSERT INTO x (a, b, c) VALUES ('hello', 'there', 'c1');
INSERT INTO x (a, b, c) VALUES ('hello', 'there', 'c2');
現在給我
ERROR: duplicate key value violates unique constraint "uniq_x_a_b"
DETAIL: Key (a, b)=(hello, there) already exists.
後來,當我做
INSERT INTO x (a, b, c) VALUES ('hello', 'there', 'c4')
ON CONFLICT ON CONSTRAINT uniq_x_a_b DO UPDATE SET c = excluded.c;
我得到
ERROR: constraint "uniq_x_a_b" for table "x" does not exist
我不明白,我違反了一個不存在的約束?任何人都有小費?
編輯
每我加
ALTER TABLE x ADD CONSTRAINT uniq_x_a_b_constraint UNIQUE (a, b);
所以這個現在適用於以下幾種情況下建議:
INSERT INTO x (a, b, c) VALUES ('hello', 'there', 'c3')
ON CONFLICT ON CONSTRAINT uniq_x_a_b_constraint DO UPDATE SET c = excluded.c;
但失敗了
INSERT INTO x (a, b, c) VALUES ('hello', NULL, 'c3')
ON CONFLICT ON CONSTRAINT uniq_x_a_b_constraint DO UPDATE SET c = excluded.c;
與
ERROR: duplicate key value violates unique constraint "uniq_x_a"
DETAIL: Key (a)=(hello) already exists.
我不能單獨a
列添加一個唯一約束,因爲它是被認爲是唯一的a
和b
組合。似乎也不可能像創建索引一樣在行的子集上構建約束。
a和b的組合應該是唯一的,只有b可以包含NULL值。 – Jan
@Jan,請參閱我的擴展答案。 –
是的,但是這在'INSERT INTO x(a,b,c)VALUES('hello',NULL,'c3')上失敗ON CONFLICT ON CONSTRAINT uniq_x_a_b_constraint DO UPDATE SET c = excluded.c;' – Jan