sql:mysql:MySql 不存在则插入,存在则更新或忽略
Posted 花和尚也有春天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql:mysql:MySql 不存在则插入,存在则更新或忽略相关的知识,希望对你有一定的参考价值。
前言
在插入数据时,可能需要忽略或替换掉重复的数据(依据某个字段),这时可以在应用层处理,也可以使用复杂的 SQL 语句来处理(如果仅仅知道一些简单的 SQL 语法的话),当然也可以使用一些简单的 SQL 语法,不过它并不是通用所有的数据库类型。
以下所有实例仅针对
mysql
而言,并不能随意用于其它数据库以下的表建的唯一索引,无论一个或多个,只要导致任何一个
UNIQUE 索引
或PRIMARY KEY
发生冲突/重复,都适用。
实例
表名称:student
表字段:
Column Name | Primary Key | Auto Increment | Unique |
---|---|---|---|
id | true | true | |
name | true | ||
age |
初始表数据:
id | name | age |
---|---|---|
1 | Jack | 18 |
注:以下所有的示例都需要被插入的数据中需要存在
UNIQUE索引
或PRIMARY KEY
字段,同时这里引入表的主键id
,并设置成自动递增
,后面可以看到它的变化
1. 不存在则插入,存在则更新(插入或可指定更新个别字段)
1.1 on duplicate key update
如果插入的数据会导致UNIQUE 索引
或PRIMARY KEY
发生冲突/重复,则执行UPDATE
语句,例:
INSERT INTO `student`(`name`, `age`) VALUES('Jack', 19)
ON DUPLICATE KEY
UPDATE `age`=19; -- If will happen conflict, the update statement is executed
-- 2 row(s) affected
这里受影响的行数是2
,因为数据库中存在name='Jack'
的数据,如果不存在此条数据,则受影响的行数为1
最新的表数据如下:
id | name | age |
---|---|---|
1 | Jack | 19 |
1.2 replace into(插入或直接更新为最新的记录)
如果插入的数据会导致UNIQUE 索引
或PRIMARY KEY
发生冲突/重复,则先删除旧数据再插入最新的数据(注意未指定的字段可能被插入空值),例:
REPLACE INTO `student`(`name`, `age`) VALUES('Jack', 18);
-- 2 row(s) affected
这里受影响的行数是2
,因为数据库中存在name='Jack'
的数据,并且id
的值会变成2
,因为它是先删除旧数据,然后再插入数据,最新的表数据如下:
id | name | age |
---|---|---|
2 | Jack | 19 |
2. insert ignore into 避免重复插入
关键字/句:insert ignore into
,如果插入的数据会导致UNIQUE索引
或PRIMARY KEY
发生冲突/重复,则忽略此次操作/不插入数据,例:
INSERT IGNORE INTO `student`(`name`, `age`) VALUES('Jack', 18);
-- 0 row(s) affected
这里已经存在name='Jack'
的数据,所以会忽略掉新插入的数据,受影响行数为0
,表数据不变。
以上。
以上是关于sql:mysql:MySql 不存在则插入,存在则更新或忽略的主要内容,如果未能解决你的问题,请参考以下文章