mysql 批量更新解决方案,网上很多推荐使用 replace into ,但是,需要深刻理解 replace into 的使用场景和副作用,不然,可能产生非常严重的后果
replace into 原理
- replace into 先判断数据是否存在,如果数据存在,先删除数据行,再执行插入语句
- 所以 replace into 并不是 update 操作,从原理上来说,相当于 DELETE + INSERT INTO 操作
判断语句存在的逻辑:主键 id + 唯一索引 列
-
如果 replace into 语句适用主键id,则根据主键id的值检测数据行是否存在,如果存在,则先删除,再插入
-
如果 replace into 语句适用唯一索引 列,则根据唯一索引 列检测数据行是否存在,如果存在,则先删除,再插入
-
如果 两者都适用,则 同时用两个列的值检测重复数据并删除,最后再插入
-
如果 表没有 id 和 唯一索引,则所有数据直接插入
replace into 适用场景
根据 replace into 原理分析,可以发现 replace into 正确使用的场景非常苛刻,使用不当,可能造成数据丢失等严重后果,且无法回复。
-
replace into 使用的表,尽量不要用唯一索引,这会造成情况的复杂性,如果不能保证 主键id + 唯一索引 完全一一对应,将会导致数据被删除。
-
replace into 使用的表,需要确保所有字段的值都插入,否则,replace into没有设置的字段,将会使用默认值,而原来的数据会被删除。
-
根据反馈,在数据库主从复制的情况下,可能会导致从库 自增id 混乱,主库和从库的数据不一致,如果使用大数据,则会进一步导致数据仓库与主库不一致,导致更多问题。