PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Częściowy unikalny indeks PostgreSQL i upsert

Nie sądzę, aby można było używać wielu indeksów częściowych jako celu konfliktu. Powinieneś spróbować osiągnąć pożądane zachowanie za pomocą jednego indeksu. Jedynym sposobem, jaki widzę, jest użycie unikalnego indeksu wyrażeń:

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

Teraz wszystkie trzy testy (wykonane dwukrotnie) naruszają ten sam indeks:

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

W poleceniu wstawiania należy przekazać wyrażenia użyte w definicji indeksu:

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. Do czego służy konstruktor wierszy?

  2. Python psycopg2 cursor.fetchall() zwraca pustą listę, ale cursor.rowcount jest> 1

  3. Nie można po prostu użyć nazwy tabeli PostgreSQL (relacja nie istnieje)

  4. Jak mogę zastąpić operatory .. i ... zakresów Rubinowych, aby zaakceptować Float::INFINITY?

  5. PostgreSQL z problemem własności dockera