sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL částečný jedinečný index a upsert

Nemyslím si, že je možné použít více dílčích indexů jako konfliktní cíl. Měli byste se pokusit dosáhnout požadovaného chování pomocí jediného indexu. Jediný způsob, jak vidím, je použití jedinečného indexu pro výrazy:

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, ''));

Nyní všechny tři testy (provedené dvakrát) porušují stejný 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

V příkazu insert byste měli předat výrazy použité v definici indexu:

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. Eclipse – Jak přidat nové připojení MariaDB

  2. CodeIgniter/PHP Active Record nezvýší celé číslo

  3. Vytvoření DDL pro základní linii pro průlet

  4. Agregovaný dotaz bez GROUP BY