mysql 避免重复添加_MySql三种避免重复插入数据的方法
前言
MySql 在存在主键冲突或唯一键冲突的情况下,根据插入方式,一般有以下三种插入方式避免错误。
insert ignore。
replace into
insert on duplicate key update
insert ignore
insert ignore 会忽视数据库中已经存在的数据,根据主键或者唯一索引判断,如果数据库没有数据,就会插入新的数据,如果有数据的话就跳过这条数据
小case
表结构
root:test> show create table t3G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c1` int(11) DEFAULT NULL,
`c2` varchar(20) DEFAULT NULL,
`c3` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uidx_c1` (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
root:test> select * from t3;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | a | 1 |
| 2 | 2 | a | 1 |
| 8 | NULL | NULL | 1 |
| 14 | 4 | bb | NULL |
| 17 | 5 | cc | 4 |
+----+------+------+------+
5 rows in set (0.00 sec)
插入冲突数据
root:test> insert ignore into t3 (c1,c2,c3) values(5,'cc',4),(6,'dd',5); Query OK, 1 row affected, 1 warning (0.01 sec)
Records: 2 Duplicates: 1 Warnings: 1
查看结果
root:test> show warnings;
+---------+------+---------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------+
| Warning | 1062 | Duplicate entry '5' for key 'uidx_c1' |
+---------+------+---------------------------------------+
1 row in set (0.00 sec)
root:test> select * from t3;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | a | 1 |
| 2 | 2 | a | 1 |
| 8 | NULL | NULL | 1 |
| 14 | 4 | bb | NULL |
| 17 | 5 | cc | 4 |
| 18 | 6 | dd | 5 |
+----+------+------+------+
6 rows in set (0.00 sec)
replace into
replace into 会尝试先插入数据,如果发现冲突进行删除。否则不做任何操作。
小case
root:test> show create table t3G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c1` int(11) DEFAULT NULL,
`c2` varchar(20) DEFAULT NULL,
`c3` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uidx_c1` (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
root:test> select * from t3;
+----+------+--------+------+
| id | c1 | c2 | c3 |
+----+------+--------+------+
| 1 | 1 | cc | 4 |
| 2 | 2 | dd | 5 |
| 3 | 3 | qwewqe | 3 |
+----+------+--------+------+
3 rows in set (0.00 sec)
插入冲突数据
root:test> replace into t3 (c1,c2,c3) values(3,'new',8);
Query OK, 2 rows affected (0.02 sec)
root:test> select * from t3;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | cc | 4 |
| 2 | 2 | dd | 5 |
| 4 | 3 | new | 8 |
+----+------+------+------+
3 rows in set (0.00 sec)
可以看到原有的记录已经没有了,新的记录又有了。
insert on duplicate key update
如果在insert into 语句末尾指定了 insert on duplicate key update 如果出现了重复值,则会在出现重复值以后进行update。
case
root:test> show create table t3G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`c1` int(11) DEFAULT NULL,
`c2` varchar(20) DEFAULT NULL,
`c3` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uidx_c1` (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
root:test> select * from t3;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | fds | 4 |
| 2 | 2 | ytu | 3 |
| 3 | 3 | czx | 5 |
+----+------+------+------+
3 rows in set (0.00 sec)
插入一条与记录id=3存在唯一键(列c1)冲突的数据
root:test> insert into t3(c1,c2,c3) values (3,'new',5) on duplicate key update c1=c1+3;
Query OK, 2 rows affected (0.01 sec)
root:test> select * from t3;
+----+------+------+------+
| id | c1 | c2 | c3 |
+----+------+------+------+
| 1 | 1 | fds | 4 |
| 2 | 2 | ytu | 3 |
| 3 | 6 | czx | 5 |
+----+------+------+------+
3 rows in set (0.00 sec)
可以看到,id=3的记录发生了改变,c1=原有的c1+3,其他列没有改变。
以上就是MySql四种避免重复插入数据的方法的详细内容,更多关于MySQL 避免插入重复数据的资料请关注脚本之家其它相关文章!
mysql 避免重复添加_MySql三种避免重复插入数据的方法相关推荐
- mysql重复上一行的快捷_MySql三种避免重复插入数据的方法
前言 MySql 在存在主键冲突或唯一键冲突的情况下,根据插入方式,一般有以下三种插入方式避免错误. insert ignore. replace into insert on duplicate k ...
- thinkphp mysql批量入库_ThinkPHP3.2框架使用addAll()批量插入数据的方法
本文实例讲述了ThinkPHP3.2框架使用addAll()批量插入数据的方法.分享给大家供大家参考,具体如下: thinkphp中model类的addAll()方法可以将数据同时添加到数据库中. / ...
- 3种mysql的储存机制_MySQL三种InnoDB、MyISAM和MEMORY存储引擎对比
三种引擎的区别: 事务:InnoDB支持事务,MyISAM和MEMORY两个不支持. 存储限制:InnoDB有64TB的存储限制,MyISAM和MEMORY要跟具体情况而定. 空间使用:InnoDB对 ...
- 的table数据重复添加_Mysql的奇技淫巧 - 避免重复插入数据
Mysql的奇技淫巧 - 避免重复插入数据 MySql 避免重复插入数据 通常那我们插入一条带有唯一性字段数据的时候,我们先去查一下数据库有没有相同数据,需要操作2次数据库,总感觉这样做特别的low, ...
- C mysql添加_MYSQL将表 B C 插入表A方法
具体情形是:有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,我们可以使用如下的语句来实现: 1.INSERT INTO db1_name(field1 ...
- mysql事务的acid、三种并发问题与四种隔离级别
这里写目录标题 事物的ACID 事物并非下所引发的三种问题 以MYSQL数据库来分析四种隔离级别 mysql相关操作 Spring事物的传播行为 事物的ACID 事务是一个不可分割的数据库操作序列,是 ...
- Mysql连接查询主要分为三种:内连接、外连接、交叉连接
Mysql 连接查询主要分为三种:内连接.外连接.交叉连接 内连接 使用比较运算符(包括=.>.<.<>.>=.<=.!>和!<)进行表间的比较操作,查 ...
- MySQL buffer pool里的三种链表和三种page
mysql buffer pool里的三种链表和三种page buffer pool是通过三种list来管理的 1) free list 2) lru list 3) flush list buffe ...
- Web应用中避免Form重复提交的三种方案
Web应用中避免Form重复提交的三种方案 2007-08-21 18:29 Web应用中重复提交的问题的三种解决方案 前两种是利用javascript,后面一种是在使用Struts的情况下的参考实现 ...
最新文章
- 程序员 - 爱的表白
- U-Mail邮件服务器树状通讯录实现智能化应用
- [vue] 说说你对vue组件的设计原则的理解
- java 堆_JAVA学习笔记 07——堆、栈和垃圾回收机制
- Python使用Manager对象实现不同机器上的进程跨网络传输数据
- ZC_汇编指令_cmp
- Linux教程系列-命令大全
- linux 命令获取屏幕亮度值,设置屏幕亮度
- Java程序员月薪20k的涨薪秘籍,系列教学
- C# MessageBox 确定|取消
- php技术逻辑思维图,PHP 逻辑思维题
- 《时间的秩序》-- 卡洛.罗韦利
- 常见API、正则表达式、Lanbda、算法
- Pr入门系列之八:添加过渡
- WordPress 简约主题mkBlog v2.2下载
- 生鲜经营——冷链管理的最后防线
- Dubbox 基本特性之结果缓存
- 由VC2010与VC2017数据结构差异造成的程序错误
- 了解基于视觉的长度测量
- 硬件面试题:共模电感有什么作用?
热门文章
- 【elasticsearch】elasticsearch 7 index.lifecycle.rollover_alias does not point to index
- 【Kafka】kafka 1.0.0 查询订阅某topic的所有consumer group
- 【Elasticsearch】Elasticsearch 索引策略
- Docker : Docker 查看容器 IP 地址以及相关信息
- 95-140-102-源码-transform-算子Map
- hive开启kerberos-beeline连接
- AtomicBoolean介绍与使用
- Cookie、Session、Token、JWT分别是什么(四)
- ajaxutil java,Ajax的工具类AjaxUtils,使用struts返回Json类型
- 为什么不建议你使用实数作为 HashMap 的key?