向数据库插入记录时,有时会有这种需求,当符合某种条件的数据存在时,去修改它,不存在时,则新增,也就是saveOrUpdate操作。这种控制可以放在业务层,也可以放在数据库层,大多数数据库都支持这种需求,如Oracle的merge语句,再如本文所讲的MySQL中的INSERT ... ON DUPLICATE KEY UPDATE语句。

该语句是基于唯一索引或主键使用,比如一个字段a被加上了unique index,并且表中已经存在了一条记录值为1,下面两个语句会有相同的效果:

INSERT INTO table (a,b,c) VALUES (1,2,3)

ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

ON DUPLICATE KEY UPDATE后面可以放多个字段,用英文逗号分割。使用ON DUPLICATE KEY UPDATE,最终如果插入了一个新行,则受影响的行数是1,如果修改了已存在的一行数据,则受影响的行数是2。

如果字段b也被加上了unique index,则该语句和下面的update语句是等效的:

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

如果a=1 OR b=2匹配了多行,则只有一行会被修改。通常的,在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);

在ON DUPLICATE KEY UPDATE后面使用VALUES()方法,这个语句等同于下面的两个语句:

INSERT INTO table (a,b,c) VALUES (1,2,3)

ON DUPLICATE KEY UPDATE c=3;--1+2

INSERT INTO table (a,b,c) VALUES (4,5,6)

ON DUPLICATE KEY UPDATE c=9;--4+5

如果一个表中包含了一个auto_increment的字段,每次insert数据后,可以通过last_insert_id()方法返回最后自动生成的值,如果通过INSERT ... ON DUPLICATE KEY UPDATE语句修改了一条数据,那么再通过last_insert_id()方法获取的值将不正确,实际测试中是多了一个数,比如向表中增加了3条数据,那么通过last_insert_id()方法得到的值是3,但是通过该语句修改了一条数据后,通过last_insert_id()方法得到的值是4。如果想解决该问题,可以通过如下语句:

INSERT INTO table (a,b,c) VALUES (1,2,3)

ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

重点是这句id=LAST_INSERT_ID(id)。

INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO,两个命令可以处理重复键值问题,在实际上它之间有什么区别呢?

前提条件是这个表必须有一个唯一索引或主键。

1、REPLACE发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。

2、INSERT发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。

这样REPLACE的操作成本要大于 insert  ON DUPLICATE KEY UPDATE ,按道理应该选用insert  ON DUPLICATE KEY UPDATE

测试:

/**/

INSERT INTO `fuwu_wuliu_info` VALUES (0,'aaa','bb','123','456','北京','北京','朝阳','大望路','',NOW()) ON DUPLICATE KEY UPDATE

`nick`='dd',`receiver`='11',`mobile`='0000',`telephone`='789',`province`='上海',`city`='上海',`area`='宝山',`address`='----',`remark`='无',`addtime`=NOW()

/**/

REPLACE  INTO `fuwu_wuliu_info` VALUES (0,'aa3','bb','123','456','河南','河南','河南','河南','',NOW())

mysql的判断更新_mysql判断记录是否存在,存在则更新,不存在则插入相关推荐

  1. mysql 主机不存在_MySQL 当记录不存在时插入,当记录存在时更新

    MySQL 当记录不存在时插入,当记录存在时更新 2012-1-30 17:58 Monday 分类:MySQL 评论(71) 浏览(21592) MySQL 当记录不存在时插入,当记录存在时更新 网 ...

  2. mysql字段是否存在_mysql判断列是否存在

    本篇文章将通过存储过程来判断列(字段)是否存在.请看详情. 推荐课程:MySQL教程. 判断字段是否存在:DROP PROCEDURE IF EXISTS schema_change; DELIMIT ...

  3. mysql字段是否存在_Mysql判断表字段或索引是否存在

    判断字段是否存在: DROP PROCEDURE IF EXISTS schema_change; DELIMITER // CREATE PROCEDURE schema_change() BEGI ...

  4. mysql 是否包括字符_mysql判断是否包含某个字符的方法

    mysql判断是否包含某个字符的方法 用locate 是最快的,like 最慢.position一般 实战例子: select * from historydata where locate('0', ...

  5. mysql navicat创建函数_MySQL 学习记录

    1.入门 1.1 什么是数据库? 简单的说,数据库(英文Database)就是一个存放数据的仓库,这个仓库是按照一定的数据结果(数据结构是指数据的组织形式或数据之间的联系)来组织.存储的,我们可以通过 ...

  6. MYSQL数据库字段关联_MySQL数据库 字段操作 多表关系(更新中...)

    外键 (foreign key) ## 外键 ```mysql # 作者(author):id,name,sex,age,mobile, detail_id # 作者详情(author_detail) ...

  7. mysql查看表描述_MySQL表记录操作介绍(重点介绍查询操作)

    MySQL表记录操作指的是对数据库表中数据进行CRUD增删改查操作,一下将一一给大家介绍,重点介绍查询操作. 一.插入数据(INSERT) 二.删除数据(DELETE) 三.修改数据(UPDATE) ...

  8. mysql语句怎么记_mysql语句记录

    INSERT INTO as_devconfig_9300(DevID,MonID, vc_Name,i_DevType,vc_Param2) VALUES('1111','18','衡阳.110kV ...

  9. mysql 多行唯一_mysql – 具有唯一约束的原子多行更新

    我有一个以排序顺序显示的标签表.为了确保没有两行可以具有相同的排名,它们的值是唯一的: create table label ( id_label serial not null, rank inte ...

最新文章

  1. 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(DOM)
  2. c语言p1口转向灯实验,实验三模拟汽车左右转向灯控制.doc
  3. 语雀携手Teambition,玩转项目协作与知识管理
  4. Oracle 等待事件(Wait Event):Sync ASM rebalance 解析
  5. Python 数据结构 树
  6. 基于 Token 的身份验证
  7. 中标麒麟linux系统安装打印机_中标麒麟系统安装教程
  8. Java课程设计之简易计算器:设计的计算器应用程序是基于AWT的,可以完成加法、减法、乘法、除法和取余运算。
  9. 计算机软件考试——嵌入式系统设计师 知识点汇总
  10. 【ACM-ICPC 2018 北京赛区网络预赛】B题Tomb Raider ---- 状态压缩+思维★
  11. “别人家”的毕设:造了个车!拆装驾驶一步到位,宅家5个月,设计建模组装自行完成
  12. 跟狗屎一样的代码,到底该如何重构?
  13. 吴恩达机器学习笔记(自用)
  14. 从电路交换到分组交换——TDM、ATM
  15. FPGA_demo2:按键测试
  16. .NET之Hangfire快速入门和使用 (定时任务调度的一种解决方案)
  17. 普林斯顿大学计算机科学研究生条件,普林斯顿大学计算机科学工程理学硕士研究生申请要求及申请材料要求清单...
  18. linux的qt中出现error2,Windows下Qt代码出现的错误总结
  19. 在Linux中卸载Refind
  20. C#怎么将GBK编码转换成UTF-8编码?

热门文章

  1. linux启动,重启,停止 jar,.sh脚本
  2. tensor转换 pytorch tensorflow
  3. kwargs.pop是什么意思
  4. tf.contrib.layers.xavier_initializer
  5. 基于Android和SpringBoot的购物App
  6. 大三Java后端暑期实习面经总结——Java容器篇
  7. NVIDIA GPU上的直接线性求解器
  8. 硬件安全模块如何启用AUTOSAR
  9. 前后端分离nginx配置,同时解决跨域问题
  10. mysql数据库是一个软件呐_15款好用的mysql管理软件