"ON" 处或附近的 postgres 语法错误
postgres syntax error at or near "ON"
我创建了这个 table:
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)
支持的版本
根据上面@klin 的评论,ON CONFLICT
仅从 PostgreSQL 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
中的 conflict_target
另一种语法是修改您的创建语句以在其中包含唯一条件;例如
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
);
根据错误码,您的版本不支持ON CONFLICT.
在 PostreSQL 9.6 上,错误消息是 -
[Code: 0, SQL State: 42P10] ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
我创建了这个 table:
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)
支持的版本
根据上面@klin 的评论,ON CONFLICT
仅从 PostgreSQL 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
中的 conflict_target另一种语法是修改您的创建语句以在其中包含唯一条件;例如
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
);
根据错误码,您的版本不支持ON CONFLICT.
在 PostreSQL 9.6 上,错误消息是 -
[Code: 0, SQL State: 42P10] ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification