我创建了这个表:
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及 更高版本支持。
ON CONFLICT
独特的约束
在添加唯一索引activity_name。目前,该列上没有任何约束,因此该列上没有冲突的可能性。
activity_name
CREATE UNIQUE INDEX UK_config_activity_log__activity_name ON config_activity_log (activity_name);
但是,如果您不希望该列是唯一的,那么您打算遇到什么冲突/您希望通过该on conflict操作解决的问题是什么?
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 );