PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Няма уникално ограничение или ограничение за изключване, съответстващо на ON CONFLICT

Според документите,

Всички уникални индекси table_name, които, без оглед на реда, съдържат точно посочените отconflict_target колони/изрази, се извеждат (избират) като арбитражни индекси. Ако е посочен index_predicate, той трябва, като допълнително изискване за извод, да удовлетворява арбитражните индекси.

Документите продължават да казват,

[index_predicate] се използват, за да позволят извод за частични уникални индекси

По занижен начин документите казват, че когато се използва частичен индекс и се добавя с ON CONFLICT, предиката index_ трябва да бъде посочен . За вас не се предполага. Научих това тук и следващият пример демонстрира това.

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

така че имаме:

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

Без index_predicate получаваме грешка:

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

Но ако вместо това включите index_predicate, 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;

тогава няма грешка и НЕ НАПРАВИ НИЩО се уважава.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Търсене в пълен текст от PostgreSQL 8.3

  2. Как да получите заявка за атрибути на колона от името на таблицата с помощта на PostgreSQL?

  3. Относно въздействието на писане на цяла страница

  4. Postgresql колоната не е намерена, но се показва в описанието

  5. Клауза Go и IN в Postgres