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

Ingen unikke eller ekskluderende begrænsninger, der matcher ON CONFLICT

Ifølge dokumenterne,

Alle tabelnavn unikke indekser, der, uden hensyn til rækkefølge, indeholder nøjagtigt de konfliktmål-specificerede kolonner/udtryk udledes (valgt) som arbiterindekser. Hvis et index_prædikat er specificeret, skal det, som et yderligere krav til slutning, opfylde arbiter-indekser.

Dokumenterne fortsætter med at sige,

[index_predicate] bruges til at tillade slutning af partielle unikke indekser

På en underspillet måde siger dokumenterne, at når du bruger et delvist indeks og ophæver med ON CONFLICT, skal index_prædikatet angives . Det er ikke udledt for dig. Jeg lærte det her, og det følgende eksempel viser dette.

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å vi har:

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

Uden index_predicate vi får en fejl:

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 hvis du i stedet inkluderer index_prædikatet, 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;

så er der ingen fejl, og GØR INTET er hædret.



  1. Introduktion til Oracle Mobile Cloud Service

  2. oracle -- Opdel flere kommaseparerede værdier i oracle-tabellen til flere rækker

  3. Sådan opretter du en bruger og giver tilladelser i Oracle

  4. Advarsel:PDO::__construct():[2002] Ingen sådan fil eller mappe (forsøger at oprette forbindelse via unix:///tmp/mysql.sock) i