前言

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三种避免重复插入数据的方法相关推荐

  1. mysql重复上一行的快捷_MySql三种避免重复插入数据的方法

    前言 MySql 在存在主键冲突或唯一键冲突的情况下,根据插入方式,一般有以下三种插入方式避免错误. insert ignore. replace into insert on duplicate k ...

  2. thinkphp mysql批量入库_ThinkPHP3.2框架使用addAll()批量插入数据的方法

    本文实例讲述了ThinkPHP3.2框架使用addAll()批量插入数据的方法.分享给大家供大家参考,具体如下: thinkphp中model类的addAll()方法可以将数据同时添加到数据库中. / ...

  3. 3种mysql的储存机制_MySQL三种InnoDB、MyISAM和MEMORY存储引擎对比

    三种引擎的区别: 事务:InnoDB支持事务,MyISAM和MEMORY两个不支持. 存储限制:InnoDB有64TB的存储限制,MyISAM和MEMORY要跟具体情况而定. 空间使用:InnoDB对 ...

  4. 的table数据重复添加_Mysql的奇技淫巧 - 避免重复插入数据

    Mysql的奇技淫巧 - 避免重复插入数据 MySql 避免重复插入数据 通常那我们插入一条带有唯一性字段数据的时候,我们先去查一下数据库有没有相同数据,需要操作2次数据库,总感觉这样做特别的low, ...

  5. C mysql添加_MYSQL将表 B C 插入表A方法

    具体情形是:有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,我们可以使用如下的语句来实现: 1.INSERT INTO db1_name(field1 ...

  6. mysql事务的acid、三种并发问题与四种隔离级别

    这里写目录标题 事物的ACID 事物并非下所引发的三种问题 以MYSQL数据库来分析四种隔离级别 mysql相关操作 Spring事物的传播行为 事物的ACID 事务是一个不可分割的数据库操作序列,是 ...

  7. Mysql连接查询主要分为三种:内连接、外连接、交叉连接

    Mysql 连接查询主要分为三种:内连接.外连接.交叉连接 内连接 使用比较运算符(包括=.>.<.<>.>=.<=.!>和!<)进行表间的比较操作,查 ...

  8. MySQL buffer pool里的三种链表和三种page

    mysql buffer pool里的三种链表和三种page buffer pool是通过三种list来管理的 1) free list 2) lru list 3) flush list buffe ...

  9. Web应用中避免Form重复提交的三种方案

    Web应用中避免Form重复提交的三种方案 2007-08-21 18:29 Web应用中重复提交的问题的三种解决方案 前两种是利用javascript,后面一种是在使用Struts的情况下的参考实现 ...

最新文章

  1. 程序员 - 爱的表白
  2. U-Mail邮件服务器树状通讯录实现智能化应用
  3. [vue] 说说你对vue组件的设计原则的理解
  4. java 堆_JAVA学习笔记 07——堆、栈和垃圾回收机制
  5. Python使用Manager对象实现不同机器上的进程跨网络传输数据
  6. ZC_汇编指令_cmp
  7. Linux教程系列-命令大全
  8. linux 命令获取屏幕亮度值,设置屏幕亮度
  9. Java程序员月薪20k的涨薪秘籍,系列教学
  10. C# MessageBox 确定|取消
  11. php技术逻辑思维图,PHP 逻辑思维题
  12. 《时间的秩序》-- 卡洛.罗韦利
  13. 常见API、正则表达式、Lanbda、算法
  14. Pr入门系列之八:添加过渡
  15. WordPress 简约主题mkBlog v2.2下载
  16. 生鲜经营——冷链管理的最后防线
  17. Dubbox 基本特性之结果缓存
  18. 由VC2010与VC2017数据结构差异造成的程序错误
  19. 了解基于视觉的长度测量
  20. 硬件面试题:共模电感有什么作用?

热门文章

  1. 【elasticsearch】elasticsearch 7 index.lifecycle.rollover_alias does not point to index
  2. 【Kafka】kafka 1.0.0 查询订阅某topic的所有consumer group
  3. 【Elasticsearch】Elasticsearch 索引策略
  4. Docker : Docker 查看容器 IP 地址以及相关信息
  5. 95-140-102-源码-transform-算子Map
  6. hive开启kerberos-beeline连接
  7. AtomicBoolean介绍与使用
  8. Cookie、Session、Token、JWT分别是什么(四)
  9. ajaxutil java,Ajax的工具类AjaxUtils,使用struts返回Json类型
  10. 为什么不建议你使用实数作为 HashMap 的key?