本文实例讲述了mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点。分享给大家供大家参考,具体如下:

replace into和insert into on duplicate key update都是为了解决我们平时的一个问题

就是如果数据库中存在了该条记录,就更新记录中的数据,没有,则添加记录。

我们创建一个测试表test

CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(32) DEFAULT '' COMMENT '姓名', `addr` varchar(256) DEFAULT '' COMMENT '地址', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO testVALUES(NULL, 'a', 'aaa'),(NULL, 'b', 'bbb'),(NULL, 'c', 'ccc'),(NULL, 'd', 'ddd');

我们运行如下语句:

REPLACE INTO test VALUES(NULL, 'e', 'eee');

注意上面的语句,我们并没有填写主键ID。

然后我们再执行下面的语句:

REPLACE INTO test VALUES(1, 'aa', 'aaaa');

为什么会出现这种情况,原因就是replace into会首先尝试先往表里面插入记录,因为我们的ID是主键,不可重复,显然这条记录是无法插入成功的,然后replace into会把这条已存在的记录删掉,然后再插入,所以会显示影响行数是2。

我们再运行下面这条语句:

REPLACE INTO test(id,name) VALUES(1, 'aaa');

显然addr字段内容没有了,跟我们上面的分析是一致的,reaplce into先删除了id为1的记录,然后再插入记录,但我们并没有指定addr的值,所以会如上图所示那样。

但是有些时候我们的需求是,如果记录存在则更新指定字段的数据,原有字段数据仍保留,而不是上面所示的,addr字段数据没有了。

这里就需要用到insert into on duplicate key update

执行如下语句:

INSERT INTO test (id, name)VALUES(2, 'bb') ON DUPLICATE KEY UPDATE name = VALUES(name);

结果显示,影响行数2条

如上图所示,addr字段的值被保留了。

insert into on duplicate key update语句的做法是先插入记录,如果不成功,则更新记录,但是为什么影响的行数是2?

我们重新建一张表test2

CREATE TABLE `test2` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `sn` varchar(32) DEFAULT '' COMMENT '唯一键', `name` varchar(32) DEFAULT '' COMMENT '姓名', `addr` varchar(256) DEFAULT '' COMMENT '地址', PRIMARY KEY (`id`), UNIQUE KEY `sn` (`sn`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO test2VALUES(NULL, '01', 'a', 'aaa'),(NULL, '02', 'b', 'bbb'),(NULL, '03', 'c', 'ccc'),(NULL, '04', 'd', 'ddd');
INSERT INTO test2 (sn, name, addr)VALUES('02', 'bb', 'bbbb')ON DUPLICATE KEY UPDATE name = VALUES(name),addr = VALUES(addr);

每运行一次上面的语句,虽然影响行数为0,但表test2的自增字段就加1。

显然如果insert into on duplicate key update语句仅仅只是在原记录基础上进行更新操作的话,自增字段是不会自动加1的,说明它也进行了记录删除操作。

先插入记录,如果不成功,则删除原记录,但保留了除update语句后字段的值,然后把保留的值与需要更新的值合并,然后插入一条新记录。

总结:

replace into 与 insert into on duplicate key update都是先尝试插入记录,如果不成功,则删除记录,replace into不保留原记录的值,而insert into on duplicate key update保留。然后插入一条新记录。

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

更多相关文章

  1. 《Android和PHP最佳实践》官方站
  2. android用户界面之按钮(Button)教程实例汇
  3. TabHost与RadioGroup结合完成的菜单【带效果图】5个Activity
  4. Android(安卓)UI开发第十七篇——Android(安卓)Fragment实例(Lis
  5. Android——Activity四种启动模式
  6. Android布局(序章)
  7. Android发送短信方法实例详解
  8. Android(安卓)读取资源文件实例详解
  9. android 蓝牙通讯

随机推荐

  1. Android(安卓)通知使用权(NotificationLi
  2. Android(安卓)http中文乱码问题
  3. Android(安卓)网络编程 API笔记 - java.n
  4. Android热修复技术
  5. Android视频录制命令screenrecord
  6. Android(安卓)Studio的gradle配置
  7. Android(安卓)实例剖析之 notepad
  8. 【转】Android(安卓)性能优化之内存检测
  9. cocos2d-x 播放视频 on Android
  10. 《第一行代码》-第一次学习笔记(第一章).md