#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
).