背景阐述
在数据库表里,一般都有主键,主键是不能重复的,因为是唯一标识。
假设这个时候需求来了,需要插入一组数据,这些数据中有些是完全新的,可以直接插入(insert),但有些主键内容是和原本表内的数据主键内容是一致的,这些就无法直接插入了,而是执行更新(update)操作。这时候就比较麻烦了,因为如果全部都是通过insert操作,必然会因为发现有重复唯一主键而报错。
一般来说,这时候需要通过业务代码来进行判断:有重复的主键值就执行更新操作,没有就插入操作。
但是PostgreSQL就提供了很好的解决方法,语法如下:
1. 主键id不重复就插入,否则更新
insert into 表名称 (字段a, 字段b, ...)
values
(value_a, value_b, ...)
on conflict (主键id)
do
update set ...略
2. 直接绑定主键名称,主键重复则更新
insert into 表名称 (字段a, 字段b, ...)
values
(value_a, value_b, ...)
on conflict on constraint this_table_key
do
update set ...略
使用以上的SQL语句后,可以直接避免修改大量的业务代码。