pgsql --不存在插入,存在更新

本文介绍了在pgsql中使用`insert into ... on conflict ... do update set`语句实现数据的不存在插入、存在更新功能。具体操作包括一条数据的处理和批量操作的模板展示,结合了mybatis框架的应用,强调冲突列需为主键或具有唯一性的字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、语句

insert into … on conflict(column_name) do update set …

conflict(column_name): column_name字段是判断要查找的数据是否存在,作为判断条件。并且column_name必须是主键或者其他具有唯一性的字段才可。

详见pgsql官方文档

二、案例

工具:mybatis+pgsql

一条数据sql:
insert into user(id,username,address,create_date,create_by)
          values('1','刘德华','香港',now(),'system')
  on conflict(id)
  do update set address='中国',update_date=now(),update_by='system'

如果id=1的用户存在,那么执行更新操作。如果不存在,则插入

此案例中以字段id为判断条件。如果传入的id=1的数据在user表中不存在,那么会insert,插入values里面指定的值。如果存在,那么更新id=1的数据,更新的字段是update后面指定的数据

批量操作:

批量操作模板

insert into table_name (column1, column2)
values
	<foreach collection = "collection"   separator=","   item="item">
			(
	 			#{item.property1},
	 			#{item.property2}
			)
	</foreach>
on conflict (column_name)
do update  set column1 = #{item.property1}

案例:
dao层

void insertOrUpdateUser(@Param("depId") String depId,
                        @Param("operator") String operator,
                        @Param("userList") List<User> userList);

sql

<update id = "insertOrUpdateUser" parametertype="java.util.HashMap">
	insert into user(username,address,depId,create_date,create_by)
	values
	<foreach collection = "userList"   separator=","   item="users">
		(
 			#{users.username},
 			#{users.address},
 			#{depId},
 			now(),
 			#{operator},
		)
	</foreach>
	on conflict(username)
	do update set depId=#{depId},
	             update_date=now(),
	             update_by=#{operator}
</update>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值