sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL gedeeltelijke unieke index en upsert

Ik denk niet dat het mogelijk is om meerdere gedeeltelijke indexen als conflictdoel te gebruiken. U moet proberen het gewenste gedrag te bereiken met behulp van een enkele index. De enige manier die ik kan zien is om een ​​unieke index op uitdrukkingen te gebruiken:

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 schenden alle drie de tests (twee keer uitgevoerd) dezelfde 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

In het insert-commando moet u de uitdrukkingen doorgeven die in de indexdefinitie worden gebruikt:

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. Grootste waarde uit twee of meer velden

  2. MySQL INTERVAL Minuten

  3. Hoe u het einde van de maand kunt krijgen in MariaDB

  4. Hoe rijen naar kolommen te converteren in Oracle SQL