sql >> Database >  >> RDS >> PostgreSQL

Geen unieke of uitsluitingsbeperking die overeenkomt met ON CONFLICT

Volgens de documenten,

Alle unieke indexen van table_name die, ongeacht de volgorde, exact de door conflict_target gespecificeerde kolommen/expressies bevatten, worden afgeleid (gekozen) als arbiterindexen. Als een index_predicaat is gespecificeerd, moet het, als een verdere vereiste voor gevolgtrekking, voldoen aan arbiterindexen.

De documenten zeggen verder:

[index_predicaat wordt gebruikt] om gevolgtrekking van gedeeltelijke unieke indexen toe te staan

Op een ingetogen manier zeggen de documenten dat bij gebruik van een gedeeltelijke index en het upseren met ON CONFLICT, het index_predicaat moet worden opgegeven . Het is niet bedoeld voor u. Ik heb dit hier geleerd en het volgende voorbeeld laat dit zien.

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

zodat we hebben:

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

Zonder index_predicate we krijgen een foutmelding:

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

Maar als u in plaats daarvan het index_predicaat opneemt, 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;

dan is er geen fout en wordt NIETS gehonoreerd.



  1. Belangrijkste technologische veranderingen in E-Business Suite 12.2

  2. Primaire sleutel verwijderen in MySQL

  3. SQLAlchemy - SQLite voor testen en Postgresql voor ontwikkeling - Hoe overzetten?

  4. Ondersteunt uw Salesforce-stuurprogramma bulkacties?