Mysql如何实现不存在则插入,存在则更新
数据准备
ON DUPLICATE KEY UPDATE
insert into test_table(id,username) VALUES(4,'fukaiit') ON DUPLICATE KEY UPDATE username='fukaiit'
执行如上sql,该id不存在(此处id不存在,指的是id为X的记录不存在,包括主键、unique索引列等情况),相当于执行了insert部分,普通插入,受影响的行:1。
insert into test_table(id,username) VALUES(1,'fukaiit') ON DUPLICATE KEY UPDATE username='fukaiit'
执行如上sql,该id已存在,相当于执行了update部分,受影响的行:2。
执行结果如下,注意只是更新username,是保留了email的。
REPLACE INTO … VALUES…
REPLACE INTO test_table(id,username) VALUES(5,'fukaiit');
执行如上sql,该id不存在,相当于执行了insert,普通插入,受影响的行:1。
REPLACE INTO test_table(id,username) VALUES(1,'fukaiit');
执行如上sql,该id已存在,相当于执行了删除再插入的操作,受影响的行:2。
执行结果如下,注意删除后再插入是没有email值的,所以此时email为null,注意与ON DUPLICATE KEY UPDATE的区别。
无论是insert on duplicate key update还是replace into,在插入时MySQL返回的影响行数就是插入的记录数,但是在更新时返回的影响行数是更新行数*2。
INSERT IGNORE INTO … VALUES…
INSERT IGNORE INTO test_table(id,username) values(6,'fukaiit');
执行如上sql,该id不存在,相当于执行了insert,普通插入,受影响的行:1。
INSERT IGNORE INTO test_table(id,username) values(1,'fukaiit_new');
执行如上sql,该id已存在,忽略了该插入操作,数据没有变化,受影响的行:0。
使用DUAL虚表和NOT EXISTS
该方法与INSERT IGNORE INTO ... VALUES...方法的效果相同。
INSERT INTO test_table(id,username) SELECT 7,'fukaiit' from DUAL where NOT EXISTS (select * from test_table where id=7);
执行如上sql,该id不存在,select子句返回结果集为空,NOT EXISTS成立,相当于执行了insert,普通插入,受影响的行:1。
INSERT INTO test_table(id,username) SELECT 2,'fukaiit' from DUAL where NOT EXISTS (select * from test_table where id=2);
执行如上sql,该id已存在,select子句返回结果集不为空,NOT EXISTS不成立,则未执行插入操作,数据没有变化,受影响的行:0。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记
谈到自己在解决一个拥有 60 万条记录的 MySQL 数据库访问时,导致 MySQL CPU 占用 100% 的经过。在解决问题完成优化(optimize)之后,我发现 Discuz 论坛也存在这个问题,当时稍微提了一下2010-12-12union和子查询中order by一起使用导致排序失效问题及解决
这篇文章主要介绍了union和子查询中order by一起使用导致排序失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-12-12浅谈Mysql tinyint(1)与tinyint(4)的区别
本文主要介绍了浅谈Mysql tinyint(1)与tinyint(4)的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-03-03解决mysql不能插入中文Incorrect string value
首先我的配置文件的设置的默认字符集是utf8即2009-05-05
最新评论