私が持っているテーブルにアップサートをやろうとしている部分一意索引平野に関しては PostgreSQLの部分ユニークインデックスとアップサート
create table test (
p text not null,
q text,
r text,
txt text,
unique(p,q,r)
);
create unique index test_p_idx on test(p) where q is null and r is null;
create unique index test_pq_idx on test(p, q) where r IS NULL;
create unique index test_pr_idx on test(p, r) where q is NULL;
、
p
はないnullで、唯一
q
の一つまたは
r
nullにすることができます。しかし
insert into test(p,q,r,txt) values ('p',null,null,'a'); -- violates test_p_idx
insert into test(p,q,r,txt) values ('p','q',null,'b'); -- violates test_pq_idx
insert into test(p,q,r,txt) values ('p',null, 'r','c'); -- violates test_pr_idx
を予想通り、私はそれはまだ制約違反をスロー
insert into test as u (p,q,r,txt) values ('p',null,'r','d')
on conflict (p, q, r) do update
set txt = excluded.txt
アップサートのためのユニーク制約を使用しようとしているとき
重複インサートは、制約違反をスロー
しかし、私はon conflict
句を期待したいoそれをキャッチし、更新を行います。
私は間違っていますか? index_predicate
を使用する必要がありますか?
index_predicate Used to allow inference of partial unique indexes. Any indexes that satisfy the predicate (which need not actually be partial indexes) can be inferred. Follows CREATE INDEX format. https://www.postgresql.org/docs/9.5/static/sql-insert.html
https://stackoverflow.com/a/46728249/330315のPostgresにアップサートを実行している間ON CONFLICT句で使用されていない[部分インデックスの –
可能な複製ql](https://stackoverflow.com/questions/46727740/partial-index-not-used-in-on-conflict-clause-while-performing-an-upsert-in-postg) – Eelke