MySQL实现有记录就忽略,没记录就插入以及有记录就更新,没记录就插入

前提

MySQL版本 5.5.45,使用的引擎InnoDB.

准备数据表

现在我有张user表,看下表结构:
在这里插入图片描述
主键是id,name是普通索引,mobile是唯一索引,其他是普通字段。

insert ignore

可以实现有记录就忽略,无记录就插入。有记录和无记录是以什么为判断标准?为了彻底搞清楚,我们可以做个实验。
表里面有这些数据:
在这里插入图片描述
当insert ignore的数据包含主键的时候,只要主键相同,就认为记录存在,插入会失败,验证如下:
在这里插入图片描述
当insert ignore的数据包含唯一索引的时候,只要唯一索引相同,就认为记录存在,插入会失败,验证如下:
在这里插入图片描述
在网上看到一种错误说法:当insert ignore的数据只包含普通字段或普通索引字段时,当这些字段都相同时,也会认为记录存在。这种说法是错误的!验证如下:
为了方便测试,将表结构更改如下:
在这里插入图片描述在这里插入图片描述

replace into

可以达到有记录就更新,没记录就插入的效果。但实际上它是在有记录时先删除旧的记录,然后再插入新的记录。同样,有记录和无记录的判断标注是主键或唯一索引是否重复。
在这里插入图片描述
可以看到replace id为11的记录返回的受影响行数是2,因为是先删除旧的记录,再插入新的记录。
在这里插入图片描述
id为26的记录不存在,所以就直接插入了一条数据,受影响行数为1.

insert … on duplicate key update

插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。另外,ON DUPLICATE KEY UPDATE不能写where条件。
在这里插入图片描述可以看到,如果是更新,则返回的受影响行数是2.
在这里插入图片描述如果是新增记录,返回的受影响行数是1.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章