首页 > 解决方案 > Postgresql INSERT ON CONFLICT 语法

问题描述

欢迎使用以下测试表:

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 插入一个新值,返回 id,要么在 project_id 存在的情况下返回 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

我收到语法错误

错误:“ON”处或附近的语法错误

提前感谢您的任何提示

标签: sqlpostgresql

解决方案


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;

问题是 RETURNING id 需要放在最后,然后它认为列引用“project_id”不明确,这很奇怪。谢谢大家


推荐阅读