postgres语法错误在或附近" ON"

时间:2016-10-30 08:58:07

标签: sql postgresql upsert

我创建了这个表:

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)

2 个答案:

答案 0 :(得分:7)

支持的版本

Per @ klin上面的评论,只有 PostgreSQL 9.5 以后才支持ON CONFLICT

如果您使用的是早期版本,请在此答案中提供一些很好的信息:https://stackoverflow.com/a/17267423/361842

唯一约束

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

中的conflict_target

另一种语法是修改你的create语句以包含那里的唯一条件; e.g。

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
);

答案 1 :(得分:1)

根据错误代码,您的版本不支持 ON CONFLICT 在PostreSQL 9.6上,错误消息是 -

[Code: 0, SQL State: 42P10]  ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification