pgsql有则更新无则插入批量操作
1. 遇到主键冲突,不更新
INSERT INTO table_name (column1, column2) VALUES (value1, value2)
ON CONFLICT (column1) DO NOTHING;
-- 如果插入的数据违反了唯一性约束,PostgreSQL会忽略这个插入。
2. 返回插入或更新后的行
INSERT INTO table_name (column1, column2) VALUES (value1, value2)
ON CONFLICT (column1) DO UPDATE
SET column2 = EXCLUDED.column2
RETURNING *;
-- 使用RETURNING子句可以在插入或更新操作后返回受影响的行的信息。
3. 插入多条数据并处理冲突
INSERT INTO t1 VALUES (0,0,0,0), (1,1,1,1) ON CONFLICT DO NOTHING;
-- 插入两行数据,其中主键冲突的行不进行任何操作,主键不冲突的行正常插入。
4.如果表有组合唯一索引,可以这样处理冲突:
INSERT INTO table_name (column1, column2) VALUES (value1, value2)
ON CONFLICT (column1, column2) DO UPDATE
SET column3 = EXCLUDED.column3;
-- 如果column1和column2的组合值与现有记录冲突,则更新column3。
5.属性自增
INSERT INTO table_name (column1, column2) VALUES (value1, value2)
ON CONFLICT (column1) DO UPDATE
SET column2 = table_name.column2 + 1;
-- 如果column1的值与现有记录冲突,则将column2的值增加1。
6.条件更新
INSERT INTO table_name (column1, column2) VALUES (value1, value2)
ON CONFLICT (column1) DO UPDATE
SET column2 = EXCLUDED.column2
WHERE table_name.column3 > 100;
-- 只有当冲突行的column3值大于100时,才更新column2。

浙公网安备 33010602011771号