sql >> Databasteknik >  >> RDS >> PostgreSQL

Ingen unik eller uteslutningsbegränsning som matchar ON CONFLICT

Enligt dokumenten,

Alla tabellnamn unika index som, utan hänsyn till ordning, innehåller exakt de konflikt_mål-specificerade kolumner/uttryck antas (valda) som arbiterindex. Om ett index_predikat anges måste det, som ett ytterligare krav för slutledning, uppfylla arbiterindex.

Dokumenten fortsätter med att säga,

[index_predicate] används för att tillåta slutledning av partiella unika index

På ett underskattat sätt säger dokumenten att när du använder ett partiellt index och upphäver med ON CONFLICT, måste index_predikatet anges . Det antas inte för dig. Jag lärde mig det här, och följande exempel visar detta.

CREATE TABLE test.accounts (
    id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    type text,
    person_id int);
CREATE UNIQUE INDEX accounts_note_idx on accounts (type, person_id) WHERE ((type)::text = 'PersonAccount'::text);
INSERT INTO  test.accounts (type, person_id) VALUES ('PersonAccount', 10);

så att vi har:

unutbu=# select * from test.accounts;
+----+---------------+-----------+
| id |     type      | person_id |
+----+---------------+-----------+
|  1 | PersonAccount |        10 |
+----+---------------+-----------+
(1 row)

Utan index_predicate vi får ett felmeddelande:

INSERT INTO  test.accounts (type, person_id) VALUES ('PersonAccount', 10) ON CONFLICT (type, person_id) DO NOTHING;
-- ERROR:  there is no unique or exclusion constraint matching the ON CONFLICT specification

Men om du istället inkluderar index_predikatet, WHERE ((type)::text = 'PersonAccount'::text) :

INSERT INTO  test.accounts (type, person_id) VALUES ('PersonAccount', 10)
ON CONFLICT (type, person_id)
WHERE ((type)::text = 'PersonAccount'::text) DO NOTHING;

då är det inget fel och GÖR INGENTING är hedrad.



  1. Hur man kontrollerar inaktuell statistik

  2. Upprepa en sträng flera gånger i MySQL – REPEAT()

  3. CONSTRAINT för att kontrollera värden från en fjärrrelaterade tabell (via join etc.)

  4. Hur man skapar användare i Oracle Multitenant 12c utan C## prefix