sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL delvist unikt indeks og upsert

Jeg tror ikke, det er muligt at bruge flere delindekser som et konfliktmål. Du bør forsøge at opnå den ønskede adfærd ved hjælp af et enkelt indeks. Den eneste måde, jeg kan se, er at bruge et unikt indeks på udtryk:

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 overtræder alle tre tests (udført to gange) det samme 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

I insert-kommandoen skal du sende de udtryk, der bruges i indeksdefinitionen:

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. Gendannelse af MySQl-database fra .frm, ibdata og ib_logfile

  2. Sag i Select Statement

  3. MySQL pivot-lignende operation for at få en opdeling af procentdelen af ​​de samlede hændelser pr. dag pr. begivenhedstype

  4. Hvorfor opfører UNION ALL sig forskelligt med og uden parentes?