美文网首页
mysql数据插入更新语句ON DUPLICATE KEY UP

mysql数据插入更新语句ON DUPLICATE KEY UP

作者: yimengtianya1 | 来源:发表于2020-10-30 15:30 被阅读0次

1、背景

当我们需要对已插入mysql的数据进行更新时,会碰到两种情况:
1、该记录可能存在,则进行内容更新;
2、该记录不存在,则进行插入。
如果采用两段sql进行处理,数据处理不能保证原子性,即两段sql处理同一条数据存在时间差,在并发请求下会导致数据出错。
此时,可以采用

insert into table (col1,col2...) values
 (v11, v12...),(v21,v22...)...
on duplicate key update col1=VALUES(col1),col2=VALUES(col2)... ;

2、举例

1、创建一张mysql的测试表。
注意表中的主键、索引

CREATE TABLE `test` (
  `id` bigint(20) NOT NULL COMMENT '主键id',
  `productinfo_id` int(11) NULL DEFAULT NULL COMMENT '产品信息Id',
  `rank` int(11) NULL DEFAULT NULL COMMENT '排名',
  `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `IX_productinfo_id` (`productinfo_id`) USING BTREE
 )
 COMMENT='测试'
 COLLATE='utf8mb4_unicode_ci'
 ENGINE=InnoDB
 ;

2、插入原始数据

 insert into `test` (id, productinfo_id, rank) values
  (1, 1, 1)
  ,(2, 2, 2)
  ,(3,3, 3)
 ;
图片.png

3、进行数据更新

insert into `test`(id, productinfo_id, rank) values
     (4, 1, 5), (5, 2, 2)
ON DUPLICATE KEY UPDATE 
productinfo_id=VALUES(productinfo_id),
rank=VALUES(rank),
id=VALUES(id) 
;
图片.png

3、说明

1、ON DUPLICATE KEY UPDATE 会以表的索引或主键(索引优先)为标识,进行数据查询更新。

(1)当存在索引时,以索引为身份标识,判定新旧两条记录是否为同一对象,从而进行更新;
(2)当索引不存在时,则以主键作为身份标识,进行数据更新。

2、匹配到多条记录时,只会更新一条记录,其它记录会忽略。
3、原表中存在的数据,但在新表中不存在时,新表数据更新到旧表中后,该记录不会被删除。
注:如果需要标识数据已失效,需采用其它办法。
4、ON DUPLICATE KEY UPDATE仅为mysql特有的语句,其它数据库并不适用。
参考文档:
https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

相关文章

网友评论

      本文标题:mysql数据插入更新语句ON DUPLICATE KEY UP

      本文链接:https://www.haomeiwen.com/subject/axrdvktx.html