ВСТАВКА Postgresql В синтаксис КОНФЛИКТА

#sql #postgresql

Вопрос:

Приветствую вас следующей таблицей тестов:

 CREATE TEMP SEQUENCE pid start 10000;
SELECT nextval ('pid');

CREATE TEMP TABLE project_test (
  id int DEFAULT nextval('pid') primary key,
  project_id int UNIQUE NOT NULL
    );
 

Я пытаюсь сделать заявление, которое либо вставляет новое значение для project_id, возвращающее идентификатор, либо возвращает идентификатор, если project_id существует.

Я попытался сделать следующее:

 INSERT INTO project_test(project_id) VALUES(50) RETURNING id 
ON CONFLICT (project_id) DO UPDATE project_test SET project_id = 50 WHERE project_id = 50 RETURNING id;
 

Я прочитал документацию здесь:
https://www.postgresql.org/docs/13/sql-insert.html
Я нахожусь на Postgres 13

Я получаю синтаксическую ошибку

ОШИБКА: синтаксическая ошибка при или около «ВКЛ.»

Заранее спасибо за любые советы

Ответ №1:

 INSERT INTO project_test(project_id) VALUES(50)
ON CONFLICT (project_id) DO UPDATE SET project_id = 50 WHERE project_test.project_id = 50 RETURNING id;
 

Проблема заключалась в том, что ВОЗВРАЩАЕМЫЙ идентификатор должен быть указан в конце, а затем он подумал, что ссылка на столбец «project_id» была неоднозначной, что странно.
Спасибо всем

Комментарии:

1. Это не странно — вам нужно устранить неоднозначность между конфликтующей строкой в таблице и строкой, которую вы хотели вставить (доступной через псевдоним EXCLUDED ).