Home » Code » Mysql插入语句replace into

Mysql插入语句replace into

在向表中插入数据时有时会遇到这样的情况,要先判断数据是否已经存在(就是主键或者唯一键下该记录已经存在),如果存在了就更新这条记录,不存在时则插入。在Mysql中,可以使用replace into解决。

比如有这样一个记录用户最新登陆IP的表loginIP,有自增的主键id,关联用户的userId以及IP三个字段,只记录最新的一条,因此一个用户只有一条记录,userId有唯一索引。(这样的表看似userId为主键即可,id多余,好吧,为说明问题而已,姑且这样)。

Mysql inplace into

表结构

在这样的设定下,插入一个用户的最新IP时,要先判断表中是否已经存在了该用户的记录,存在就把IP更新为最新的,否则直接插入。replace into的写法是:

REPLACE INTO loginIP (id, userId, IP) VALUES (null, '1', '1.1.1.1');
REPLACE INTO loginIP (id, userId, IP) SELECT null, '1', '1.1.1.1';
REPLACE INTO loginIP SET id = null, userId = '1', IP = '1.1.1.1';

以上三种写法,效果是一样的。前两种用得较多,三种写法INTO都可以省略,不过不建议,写上比较直观。userId有唯一索引,如果插入的数据中userId的值在表中已经存在,Mysql会把存在的记录先删除,再插入,就达到了“更新”的效果,受影响的记录数为2。其实跟真实的更新还是有差别的,那就是id加了1,但这没什么影响。

Mysql inplace into

表中已存在的一条记录

Mysql inplace into

执行一次replace into

我们往表中再插入两条记录,这时一共有3条:

Mysql inplace into

这时我们插入数据时连同id一起插入,比如:
REPLACE INTO loginIP (id, userId, IP) VALUES (2, 2, '4.4.4.4')

在这时,id主键也是唯一的,要插入的2表中已经存在,userId的2,表中也已经有了。最终结果是把id为2的删除,把userId为2的也删除,最后才插入,受影响的记录数为3。一共3条删了2条再插入1条,结果还有2条。

Mysql inplace into

执行有2个唯一索引冲突的replace into后

可以看到,Mysql执行replace into时会根据主键和唯一索引先把所有会与新数据产生冲突的记录全部删除,再插入新数据。

嗯,这么简单一个语句截了这么多简陋的图,突然感觉很low。。。

One comment

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.