sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL partiellt unikt index och upsert

Jag tror inte att det är möjligt att använda flera partiella index som ett konfliktmål. Du bör försöka uppnå önskat beteende med ett enda index. Det enda sättet jag kan se är att använda ett unikt index på uttryck:

drop table if exists test;
create table test (
    p text not null,
    q text,
    r text,
    txt text
);

create unique index test_unique_idx on test (p, coalesce(q, ''), coalesce(r, ''));

Nu bryter alla tre testerna (som körs två gånger) mot samma index:

insert into test(p,q,r,txt) values ('p',null,null,'a'); -- violates test_unique_idx
insert into test(p,q,r,txt) values ('p','q',null,'b');  -- violates test_unique_idx
insert into test(p,q,r,txt) values ('p',null, 'r','c'); -- violates test_unique_idx

I kommandot insert ska du skicka uttrycken som används i indexdefinitionen:

insert into test as u (p,q,r,txt) 
values ('p',null,'r','d') 
on conflict (p, coalesce(q, ''), coalesce(r, '')) do update 
set txt = excluded.txt;



  1. CakePHP 3 defaultConnectionName i plugin-modellen fungerar inte

  2. Frågar du kommaseparerat fält?

  3. ställ in PostgreSQL med Laravel i MAMP

  4. Få resultat från räknefrågor via getSingleScalarResult() och groupBy() - undantag