必威体育Betway必威体育官网
当前位置:首页 > IT技术

MySQL_插入更新 ON DUPLICATE KEY UPDATE

时间:2019-08-23 06:13:12来源:IT技术作者:seo实验室小编阅读:52次「手机版」
 

duplicate

平时我们在设计数据库表的时候总会设计 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 ...');

}

但是这样写有两个问题

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';

Step3. 查询数据的变化情况

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

技巧:

技巧 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都是唯一索引,插入的数据在两条记录上产生了冲突,然而执行后只有第一条记录被修改

相关阅读

麻城乡情网麻城论坛与Discuz!同步更新

麻城乡情网负责人“占佳林”表示,发展中的麻城乡情网麻城论坛正在努力通过强化社区建设,采用主流多元化的社区产品提升网

关于DuplicateHandle() 转换伪句柄成真实句柄值的疑问

参考:http://topic.csdn.net/u/20100806/09/f89294ac-fcf7-4a05-bb00-8480c3793ecb.html

ios热更新JSPatch

由于在公司里使用的是企业级证书,不需发布到APPStore上,那么热更新就有必要写起来了,毕竟要是线上出了Bug,心里还是慌得一笔的哈哈。

区别Console.readkey()、 Console.read()、Console.re

Console.readkey():监听键盘事件,按任意键执行退出。 Console.read():读取键盘输入的第一个字符,返回ASCII值。按下回车键退出 Cons

博百优 坚持原创更新很重要

今天是我参加博百优第二天,虽然没什么经验,但我乐于学习;虽然我不知道在博百优SEO比赛需要更多技术知识,但我知道内容为王,只要坚持每

分享到:

栏目导航

推荐阅读

热门阅读