该ON CONFLICT
构造需要UNIQUE
约束才能起作用。从INSERT .. ON CONFLICT
子句的文档中:
可选ON CONFLICT
子句指定了引发 或 违反错误的替代操作。对于建议插入的每个单独行,要么继续插入,要么如果违反了由conflict_target指定的仲裁者约束或索引,则采用替代性的action_action。ON CONFLICT DO NOTHING
只是避免插入一行作为其替代操作。ON CONFLICT DO UPDATE
更新与建议插入的行冲突的现有行作为其替代操作。
现在,问题还不是很清楚,但是您可能需要UNIQUE
对合并的2列进行约束(category_id, gallery_id)
。
ALTER TABLE category_gallery
ADD CONSTRAINT category_gallery_uq
UNIQUE (category_id, gallery_id) ;
如果该行被插入的比赛 已经在桌子上有一个行的值,然后代替INSERT
,这样做的UPDATE
:
INSERT INTO category_gallery (
category_id, gallery_id, create_date, create_by_user_id
) VALUES ($1, $2, $3, $4)
ON CONFLICT (category_id, gallery_id)
DO UPDATE SET
last_modified_date = EXCLUDED.create_date,
last_modified_by_user_id = EXCLUDED.create_by_user_id ;
您可以使用UNIQUE约束的任一列:
ON CONFLICT (category_id, gallery_id)
或约束名称:
ON CONFLICT ON CONSTRAINT category_gallery_uq