PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL частичен уникален индекс и upsert

Не мисля, че е възможно да се използват множество частични индекси като цел на конфликт. Трябва да се опитате да постигнете желаното поведение, като използвате един индекс. Единственият начин, който виждам, е да използвам уникален индекс на изрази:

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

Сега и трите теста (изпълнени два пъти) нарушават един и същ индекс:

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

В командата за вмъкване трябва да подадете изразите, използвани в дефиницията на индекса:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Node.js:Дефиниране на схеми на Postgres в Sequelize

  2. Списъци с ограничения за всички таблици с различни собственици в PostgreSQL

  3. Създайте неизменен клонинг на concat_ws

  4. Съкращения за търсене в пълен текст на PostgreSQL

  5. ГРЕШКА на PostgreSQL:подзаявка в FROM не може да препраща към други отношения на същото ниво на заявка