sql >> Databáze >  >> RDS >> PostgreSQL

Žádné jedinečné nebo vyloučení omezení neodpovídá ON CONFLICT

Podle dokumentů

Všechny jedinečné indexy název_tabulky, které bez ohledu na pořadí obsahují přesně sloupce/výrazy zadané jako cílový_konflikt, jsou odvozeny (vybrány) jako indexy arbitrů. Pokud je zadán predikát indexu, musí jako další požadavek pro odvození splňovat indexy arbitrů.

Dokumenty dále říkají,

[index_preddicate se používají]k umožnění odvození dílčích jedinečných indexů

Dokumenty podhodnoceným způsobem říkají, že při použití částečného indexu a nahrazení pomocí ON CONFLICT musí být zadán predikát indexu . Není to pro vás odvozeno. Naučil jsem se to zde a následující příklad to ukazuje.

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

takže máme:

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

Bez index_predicate dostaneme chybu:

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

Ale pokud místo toho zahrnete predikát indexu, 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;

pak nedojde k žádné chybě a NEDĚLEJTE NIC.



  1. Oracle Security Alert pro CVE-2021-44228

  2. 9 nejčastějších chyb návrhu databáze

  3. InMemory DUPLICATE Zmatek v Oracle RAC

  4. Jak zkopírujete záznam v tabulce SQL, ale vyměníte jedinečné ID nového řádku?