博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL_插入更新 ON DUPLICATE KEY UPDATE
阅读量:5322 次
发布时间:2019-06-14

本文共 1894 字,大约阅读时间需要 6 分钟。

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

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

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

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

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

逻辑上我们需要怎么写:

$result = mysql_query('select * from xxx where id = 1');$row = mysql_fetch_assoc($result);if($row){mysql_query('update ...');}else{mysql_query('insert ...');}

但是这样写有两个问题

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

还好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';
Step3. 查询数据的变化情况
 
 
==========================     话外篇   ===============================
技巧:
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。
 
注意事项:
若多个索引都冲突,则只有一条记录被修改。
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都是唯一索引,插入的数据在两条记录上产生了冲突,然而执行后只有第一条记录被修改

转载于:https://www.cnblogs.com/liaojie970/p/8855703.html

你可能感兴趣的文章
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
js 获取视频的第一帧
查看>>
各种正则验证
查看>>
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>