起源
碰到这个问题是这样的,最近在做一个项目开发中碰到一种写法
$Db->table('tablename')->insert($data,true);
之前都是直接用的insert,不知道这个true有啥用
分析
查看了一下文档,这个参数支持insert和replace两种方法,而replace的主要特点如下:
圆善的学习园地-慎用MySQL replace语句
大概意思就是,replace可以检查插入数据时的主键冲突或唯一索引冲突,如果冲突的话就会对之前的数据进行更新。
但这里有一点小坑,也是项目中实际遇到的,replace into 的执行,是先delete然后再insert,会有两种问题:
1.会导致自增ID+1,如上文所说,如果有主从数据库会导致表自增ID不一致
2.如果$data中不包含全部的字段数据,replace之后,未指定的数据会变成默认值(这个很坑,甚至有可能改变ID)
解决
上文的最下面也给出了一些参考的解决方案,我觉得这个方法就很不错
ON DUPLICATE KEY UPDATE 用法与说明
不过感觉依然不是特别好用,实际项目中我可能还是会选择先check,再insert。
总之使用replace的时候还是要慎重仔细,不然可能导致数据丢失和数据错乱。