需求背景
环境
MySQL 版本: 5.7.20-log
开发规范
公司后端开发规范有这么一点:
更新数据库表中数据的时候,不允许先删,然后批量插入
需要将参与表中数据比判断,找出哪些是新插入,哪些需要更新,哪些是删除的,然后再做对应的数据操作
需求
我们有 表 如下:
当商品配送完后之后,需要记录它的最新配送价,若商品最新配送价已经存在则进行更新,不存在则执行插入
针对这个需求,我们有哪些实现方式?
代码处理
按开发规范中说的处理
通过代码在内存中进行数据处理,找出插入列表与更新列表,然后执行数据库操作
因为是很常规的插入与更新操作,所以这种处理方式适用于所有的关系型数据库
REPLACE INTO
当数据库是 MySQL ,碰到 不存在则插入,存在则更新 的需求时,第一时间往往想到的是REPLACE INTO
工作原理
replace into 跟 insert 功能类似
不同点在于: replace into 首先尝试插入数据到表中,如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据,否则直接插入新数据
replace 语句会返回一个数,表示受影响的行的数目,该数是被删除和被插入的行数的和
我们来看个示例
对于示例结果,相信大家都能理解
需要强调的是:根据唯一索引 uk_comany_ware 判定 (1001,10001,19.8,1,1) 已经存在,那么先删除此记录,然后插入 (100