Mysql插入一条数据,存在就更新,不存在就插入(必须有唯一键)
mysql表中,有个联合唯一索引
CREATE TABLE `news_visite` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`news_id` bigint(11) DEFAULT NULL COMMENT '资讯ID',
`user_id` bigint(11) DEFAULT NULL COMMENT '用户ID',
`read_time` datetime DEFAULT NULL COMMENT '浏览时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `unikey` (`news_id`,`user_id`) USING BTREE COMMENT '唯一索引,不存在则插入,已存在则更新'
) ENGINE=InnoDB AUTO_INCREMENT=6880 DEFAULT CHARSET=utf8mb4 COMMENT='作品浏览记录';
方式一:
INSERT...ON DUPLICATE KEY UPDATE
,如果指定了ON DUPLICATE KEY UPDATE
,并且插入行后会导致在一个UNIQUE索引
或PRIMARY KEY
出现重复值,则执行UPDATE
。
mybatis xml,传入 List<Long> newsIds,Long userId,Date readTime
<insert id="insertOrUpdate">
INSERT INTO news_visite (news_id, user_id, read_time)
VALUES
<foreach collection="newsIds" item="id" open="(" separator="),(" close=")">
#{id},#{userId},#{readTime}
</foreach>
ON DUPLICATE KEY UPDATE read_time = now()
</insert>
方式二:
REPLACE
关键字,使用REPLACE
的最大好处就是可以将DELETE
和INSERT
合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE
和INSERT
时添加事务等复杂操作了。
在使用REPLACE
时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE
就和INSERT
完全一样的。
在执行REPLACE
后,系统返回了所影响的行数,如果返回1,说明没有重复的记录,如果返回2,说明有重复记录,系统先DELETE
这条记录,然后再INSERT
这条记录。
语法和INSERT
非常的相似,如下面的REPLACE
语句是插入或更新一条记录。
mybatis xml,传入 List<Long> newsIds,Long userId,Date readTime
<insert id="insertOrUpdate">
REPLACE INSERT INTO news_visite (news_id, user_id, read_time)
VALUES
<foreach collection="newsIds" item="id" open="(" separator="),(" close=")">
#{id},#{userId},#{readTime}
</foreach>
</insert>