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

Двусмислена препратка към колона в INSERT ... ON CONFLICT DO UPDATE

Трябва да квалифицирате таблично колоната, където иначе би била двусмислена.
Използвайте името на виртуалната таблица excluded за препратка към входния ред. Но вероятно искате да се обърнете към целевата колона, така че се класифицирайте с името на целевата таблица:

INSERT INTO test.test_counter (id)
VALUES ('id-0')
ON CONFLICT (id) DO UPDATE
SET count = test_counter.count + 1  -- here
RETURNING count;

Ръководството:

Единичният ред от виртуалната входна таблица excluded съдържа всички колони на целевата таблица, дори ако не са посочени в списъка с целеви колони на INSERT или VALUES изразяване. Така че двусмислието, което срещате, винаги е налице, независимо дали count е насочено изрично или не.

Настрана:Колоните, пропуснати в списъка с целеви колони, по подразбиране са към съответната им колона DEFAULT стойност, която е NULL по подразбиране (NULL е колоната по подразбиране DEFAULT ). Т.е. по подразбиране ще бъде NULL във вашата настройка и 1 в моята подобрена настройка по-долу. И тригери на ниво ред BEFORE INSERT (ако има такива).

Но нито едно от тези не важи за примера, тъй като се отнася за целта колона все пак.

За отбелязване е, че другите две екземпляри на името на колоната count са недвусмислени (и следователно не изискват квалификация на таблица), тъй като могат да се отнасят само до целта таблица.

Вашата настройка може лесно да се повреди, докато колоната count не е дефинирано NOT NULL , като NULL + 1 все още е NULL . Тази настройка би имала повече смисъл:

CREATE TABLE test.test_counter (
  id    text PRIMARY KEY
, count integer NOT NULL DEFAULT 1
);

Също така не използвам имена на CaMeL в кавички в моя пример. Вижте:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мога ли да използвам командата \copy във функция на postgresql?

  2. PostGIS, възможно е да се създаде многоъгълник от някои точки

  3. Замяна на последователност със случайно число

  4. Django + Postgres + Големи времеви серии

  5. Актуализирайте записи, които отговарят на условие с нарастващо число