一尘不染

在``N''或附近的postgres语法错误

sql

我创建了这个表:

CREATE TABLE IF NOT EXISTS config_activity_log
(
  id                      serial primary key,
  activity_name           varchar(100) NOT NULL,
  last_config_version     varchar(50) NOT NULL,
  activity_status         varchar(100) NOT NULL DEFAULT 'Awaiting for cofman',
  cofman_last_update      bigint NOT NULL DEFAULT -1,
  is_error                boolean DEFAULT FALSE,
  activity_timestamp      timestamp DEFAULT current_timestamp
);

我尝试运行以下postgres脚本:

INSERT INTO config_activity_log
    (activity_name, last_config_version, activity_status)
VALUES
    ('test awating deployment','5837-2016-08-24_09-12-22', 'Awaiting for deployment')
ON CONFLICT (activity_name)
DO UPDATE SET
    activity_status = EXCLUDED.activity_status

为什么会出现此语法错误?

psql:upsert_test_log.sql:7: ERROR:  syntax error at or near "ON"
LINE 5: ON CONFLICT (activity_name)

阅读 193

收藏
2021-03-10

共1个答案

一尘不染

支持版本

根据以上@klin的评论,ON CONFLICTPostgreSQL 9.5及 更高版本支持。

独特的约束

在添加唯一索引activity_name。目前,该列上没有任何约束,因此该列上没有冲突的可能性。

CREATE UNIQUE INDEX UK_config_activity_log__activity_name 
ON config_activity_log (activity_name);

但是,如果您不希望该列是唯一的,那么您打算遇到什么冲突/您希望通过该on conflict操作解决的问题是什么?

请参阅https://www.postgresql.org/docs/9.5/static/sql-insert.html#SQL-ON-
CONFLICT中的flict_target


另一种语法是修改您的create语句,以在其中包含唯一条件。例如

CREATE TABLE IF NOT EXISTS config_activity_log
(
  id                      serial primary key,
  activity_name           varchar(100) NOT NULL UNIQUE,
  last_config_version     varchar(50) NOT NULL,
  activity_status         varchar(100) NOT NULL DEFAULT 'Awaiting for cofman',
  cofman_last_update      bigint NOT NULL DEFAULT -1,
  is_error                boolean DEFAULT FALSE,
  activity_timestamp      timestamp DEFAULT current_timestamp
);
2021-03-10