前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL的ON DUPLICATE KEY UPDATE用法 增量更新

MySQL的ON DUPLICATE KEY UPDATE用法 增量更新

作者头像
kirin
发布2021-04-09 14:42:30
5.7K0
发布2021-04-09 14:42:30
举报
文章被收录于专栏:Kirin博客Kirin博客

平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件.

此时 插入数据的时候 ,经常会有这样的情况:

我们想向数据库插入一条记录:

若数据表中存在以相同主键的记录,我们就更新该条记录。

否则就插入一条新的记录。

逻辑上我们需要怎么写:

result = mysql_query(‘select * from xxx where id = 1’);row = mysql_fetch_assoc(

但是这样写有两个问题

1、效率太差,每次执行都要执行2个sql 2、高并发的情况下数据会出问题,不能保证原子性

还好MySQL 为我们解决了这个问题:我们可以通过 ON DUPLICATE KEY UPDATE 达到以上目的, 且能保证操作的原子性和数据的完整性。

ON DUPLICATE KEY UPDATE 可以达到以下目的:

向数据库中插入一条记录:

若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。

否则插入一条新的记录。

示例:

Step1 . 创建表,插入测试数据

SET FOREIGN_KEY_CHECKS=0;

— —————————- — Table structure for mRowUpdate — —————————- DROP TABLE IF EXISTS `mRowUpdate`; CREATE TABLE `mRowUpdate` ( `id` int(11) NOT NULL, `value` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;

— —————————- — Records of mRowUpdate — —————————- INSERT INTO `mRowUpdate` VALUES (‘1’, ‘sss’); INSERT INTO `mRowUpdate` VALUES (‘2’, ‘szh’); INSERT INTO `mRowUpdate` VALUES (‘3’, ‘9999’); SET FOREIGN_KEY_CHECKS=1;

Step2 .测试 ON DUPLICATE KEY UPDATE 的使用方法:

INSERT INTO mRowUpdate(id,`value`) VALUES(3, ‘SuperMan’) ON DUPLICATE KEY UPDATE `value`=’SuperMan’;

MySQL的ON DUPLICATE KEY UPDATE用法 增量更新-麒麟博客
MySQL的ON DUPLICATE KEY UPDATE用法 增量更新-麒麟博客

Step3. 查询数据的变化情况

MySQL的ON DUPLICATE KEY UPDATE用法 增量更新-麒麟博客
MySQL的ON DUPLICATE KEY UPDATE用法 增量更新-麒麟博客

========================== 话外篇 ===============================

技巧:

技巧 1 :

ON DUPLICATE KEY UPDATE 特别适用于多行插入。如:

INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3), (4, 5, 6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`);

Tips: VALUES()函数只在INSERT…UPDATE语句中有意义,其它时候会返回NULL。

注意事项:

注意 1:

若多个索引都冲突,则只有一条记录被修改。

create table test( id int not null primary key, num int not null UNIQUE key, tid int not null ) 为了测试两个唯一索引都冲突的情况,然后插入下面的数据

insert into test values(1,1,1), (2,2,2); 然后执行:

insert into test values(1,2,3) on duplicate key update tid = tid + 1; 因为a和b都是唯一索引,插入的数据在两条记录上产生了冲突,然而执行后只有第一条记录被修改

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-04-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档