Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答

2023-05-16

最近做数据处理时候,遇到一个问题。用一个id自增主键时候,数据表中会插入大量重复数据(除ID不同)。这虽然对最终数据处理结果没有影响,但是有1个问题,如果数据量超大,对处理的速度影响成几何倍数增长!所以必须找到不重复插入的方法。

谷歌之:大量bolg有相关资料,但都是

INSERT INTO users_roles (userid, roleid) SELECT 'userid_x', 'roleid_x' FROM dual WHERE NOT EXISTS (SELECT * FROM users_roles WHERE userid = 'userid_x' AND roleid = 'roleid_x');这样的sql语句,尝试,不能解决问题。sql语法错误!

果断找官方文档,于mysql5.6版本查看到的insert文档如下图:


online help insert文档地址为:http://dev.mysql.com/doc/refman/5.6/en/insert.html

5.6版本的官方文档中没有以上语法了,这有三种插入语句。分别分析。

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name,...)] 
    [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]

With INSERT ... SELECT, you can quickly insert many rows into a table from one or many tables.不能从本表查询插入本表

Or:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name,...)]
    SET col_name={expr | DEFAULT}, ...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]

Or:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name,...)] 
    [(col_name,...)]
    SELECT ...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]
You can use  REPLACE  instead of  INSERT  to overwrite old rows.  REPLACE  is the counterpart to  INSERT IGNORE  in the treatment of new rows that contain unique key values that duplicate old rows: The new rows are used to replace the old rows rather than being discarded.

也就是说REPLACE这条语句就是替代INSERT语句重写以前的数据,也就是更新!当你有一个唯一键UNIQUE KEY时候,需要插入的行中含有这个唯一键值,REPLACE语句是重写表中已有的行,而INSERT IGNORE则是丢弃新数据处理!

关键字使用:

Note:延迟插入即DELAYED在后续版本会丢弃不用,所以不用学了。【原文:As of MySQL 5.6.6, INSERT DELAYED is deprecated, and will be removed in a future release. Use INSERT (without DELAYED) instead.

 一、LOW_PRIORITY:很可能一直不被执行。

 二、HIGH_PRIORITY:可能导致并发插入数据不可用。

Note:LOW_PRIORITY and HIGH_PRIORITY affect only storage engines that use only table-level locking (such as MyISAMMEMORY, and MERGE).

三、IGNORE:使用此关键词插入数据时,写入数据error也会被ignore。【原文:1.If you use the IGNORE keyword, errors that occur while executing the INSERT statement are ignored. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row still is not inserted, but no error occurs. Ignored errors may generate warnings instead, although duplicate-key errors do not.2.IGNORE has a similar effect on inserts into partitioned tables where no partition matching a given value is found. Without IGNORE, such INSERT statements are aborted with an error; however, when INSERT IGNORE is used, the insert operation fails silently for the row containing the unmatched value, but any rows that are matched are inserted. 

    1.也就是说当有唯一键或者主键时候,新数据和唯一键值,主键值有重复,新数据不会被写入,也不会报错。

    2.当给的value list数据类型等与表的结构不一致时候,也会ignore,不会报错。

    3.使用ignore关键字时,无效的value会根据表中对应字段的数据类型自动调整为最接近的value,也就是说value会改变。

四、 ON DUPLICATE KEY UPDATE:

    If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in aUNIQUE index or PRIMARY KEY, an UPDATE of the old row is performed. The affected-rows value per row is 1 if the row is inserted as a new row, 2 if an existing row is updated, and 0 if an existing row is set to its current values. If you specify the CLIENT_FOUND_ROWS flag to mysql_real_connect() when connecting to mysqld, the affected-rows value is 1 (not 0) if an existing row is set to its current values.

那么到此,我们已经找到三种方法实现写不重复数据!

方法1:指定一个或多个UNIQUE KEY,使用insert ignore into 指令,即遇到唯一键值相同时,丢弃新数据,这考虑到了一般都会有自增ID(必须为主键);或者用 ON DUPLICATE KEY UPDATE col_name=expr...去更新新数据到表(需要注意唯一键值不能变,否则可能出错)。

方法2:不用自增ID,用复合主键!写数据方法同上!

方法3:指定UNIQUE KEY or PRIMARY KEY用REPLACE语句。

        为什么不用自增ID呢?答:实践发现,复合主键是组合多列为1个主键,主键还是一个,所有列的值合为一个主键。用了自增ID再用复合主键等于没设复合主键。

         新问题:是可以插入了,但是ID会变的不连续。问题具体为:当有一条重复数据插入时候,使用INSERT IGNORE INTO 语句执行完毕后,重复数据没有插入但是ID自增还是运行了一次,这就导致ID出现不连续的情况。这些不连续的ID值也就是出现重复的时候。使用ON DUPLICATE KEY UPDATE时也会出现此问题。REPLACE则是删除旧记录,新纪录卸载表后面,ID还是不连续。

原因是什么呢?官方文档原文为:http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html

If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY,MySQL performs an UPDATE of the old row. For example, if column a is declared as UNIQUE and contains the value 1, the following two statements have similar effect:


INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;
  

(The effects are not identical for an InnoDB table where a is an auto-increment column.With an auto-increment column, an INSERT statement increases the auto-increment value but UPDATE does not.)

With ON DUPLICATE KEY UPDATE, the affected-rows value per row is1 if the row is inserted as a new row,2 if an existing row is updated, and0 if an existing row is set to its current values. If you specify the CLIENT_FOUND_ROWSflag to mysql_real_connect() when connecting to mysqld, the affected-rows value is 1 (not 0) if an existing row is set to its current values.

原因正是我的表中ID是一个自增量!【原文:If a table contains an AUTO_INCREMENT column and INSERT ... ON DUPLICATE KEY UPDATE inserts or updates a row, the LAST_INSERT_ID() function returns the AUTO_INCREMENT value.如果不是自增量,ID处理会更麻烦。。。这问题暂时无解。。。

Note:1. 尽量避免用ON DUPLICATE KEY UPDATE去更新多UNIQUE KEY的表,有时候会出乎意料!2. The DELAYED option is ignored when you use ON DUPLICATE KEY UPDATE.3. Thus, in MySQL 5.6.4 and later, INSERT ... SELECT ON DUPLICATE KEY UPDATE statements are flagged as unsafe for statement-based replication.复合主键或者多个唯一键时不安全。。。

Prior to MySQL 5.6.6, an INSERT that affected a partitioned table using a storage engine such as MyISAMthat employs table-level locks locked all partitions of the table. This was true even for INSERT ... PARTITION statements. (This did not and does not occur with storage engines such as InnoDB that employ row-level locking.) In MySQL 5.6.6 and later, MySQL uses partition lock pruning, so that only partitions into which rows are inserted are actually locked. For more information, see Section 18.6.4, “Partitioning and Locking”.

        转至:http://blog.csdn.net/zhanh1218/article/details/21459297

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答 的相关文章

  • 5GC 网元AMF、SMF、UPF、PCF、UDM等介绍

    5GC 网元AMF SMF AUSF UPF PCF UDM NRF NSSF NEF介绍 1 AMF Access and Mobility Management Function xff0c 接入和移动性管理功能 xff0c 执行注册
  • 如何准备校招?

    秋招已经落尽尾声 xff0c 今天小牛想把自己的学习经验分享给大家 xff0c 避免大家多走弯路 1 首先需要确定自己想从事哪方面的工作 比如服务端开发 xff08 Java开发工程师 xff0c C 43 43 开发工程师 xff09 x
  • 5GC architecture N1、N2、N3、N4、N6等接口

    5GC architecture N1 N2 N3 N4 N6 N9 N26接口 N1接口 N1接口为UE和AMF间的信令面接口 N1是逻辑概念的接口 xff0c 不存在物理口 N1接口基于N2接口信令实现 N2接口 N2接口为 R AN和
  • FAQ:报红--maven本地有jar包仍从从远端下载

    问题 xff1a 最近编译项目 xff0c 发现有个模块依赖总是编译不过 xff0c 报无法download jar包 但是查看maven配置的远端仓库 xff0c 发现maven已不支持该jar包 但是本地确实存在 xff0c idea
  • SNMP(简单网络管理协议)详解

    一 简介 SNMP 简单网络管理协议 xff1a 专门用于在 IP 网络管理网络节点 xff08 服务器 工作站 路由器 交换机及HUBS等 xff09 的一种标准协议 xff0c 它是一种应用层协议 SNMP 使网络管理员能够管理网络效能
  • XXL-JOB分布式任务调度平台

    XXL JOB 是一个轻量级分布式任务调度平台 xff0c 其核心设计目标是开发迅速 学习简单 轻量级 易扩展 现已开放源代码并接入多家公司线上产品线 xff0c 开箱即用 Gitee 地址下载 xff1a https gitee com
  • 2万字详解,吃透 ES

    之前已经分享过Elasticsearch的使用和原理的知识 xff0c 由于近期在公司内部做了一次分享 xff0c 所以本篇主要是基于之前的博文的一个总结 xff0c 希望通过这篇文章能让读者大致了解Elasticsearch是做什么的以及
  • 手动回收Linux内存

    linux的内存分配是采用大页面的方式 xff0c 有可能会出现内存回收不及时导致系统卡住的情况 xff0c 这时候可以手工回收一下内存 执行 xff1a echo 1 gt proc sys vm drop caches 查看系统资源使用
  • spring-expression表达式详解

    一 概述 Spring Expression Language xff08 简称 SpEL xff09 是一个支持查询和操作运行时对象的强大的表达式 语言 贯穿着整个 Spring 产品组的语言 SpEL是单独模块 xff0c 只依赖于co
  • Docker容器整合wagon-ssh自动化部署SpringBoot工程

    一 前提条件 xff1a 机器上已经安装了docker 安装过程 准备部署的springboot的jar包Dockerfile文件部署脚本deploy sh升级脚本upgrade sh 二 准备Dockerfile 文件 创建一个Docke
  • TIME_WAIT和CLOSE_WAIT状态区别

    在服务器的日常维护过程中 xff0c 会经常用到下面的命令 xff1a netstat n awk 39 tcp 43 43 S NF END for a in S print a S a 39 它会显示例如下面的信息 xff1a TIME
  • 迭代过程:batch和epochs

    目录 引入 使用mini batch的优点 xff1a xff08 对比传统的梯度下降 更容易找到全局最优解 缺点 xff1a 要定义的两个超参数 xff1a batch size epochs 引入数据 TensorDataset Dat
  • PlantUML 语法之时序图

    文章目录 前言 96 gt gt 96 信息传递声明参与者的几个关键字 96 as 96 重命名参与者 96 96 添加颜色 96 order 96 定义参与者顺序 96 96 参与者名字给自己发信息修改传达信息的箭头样式修改箭头颜色 96
  • 基于ArUco的视觉定位(一)

    一 ArUco简介及安装步骤 ArUco a minimal library for Augmented Reality applications based on OpenCV xff0c 是科尔多瓦大学 人工视觉应用 研究小组 xff0
  • 基于ArUco的视觉定位(三)

    一 ArUco之Marker Mapper 1 Marker Mapper简介 Mapping and Localization from Planar Markers是A V A小组基于ArUco开发的一个利用二维码建图与定位的项目 论文
  • 关于《基于ArUco的视觉定位》系列博文撤回的通知

    由于近期我们要申请发明专利 xff0c 博客中涉及较多私密内容 xff0c 所以暂时不能公开了 我把之前的网页保存了图片格式 xff0c 有想继续学习的同学可以在本博客下方评论区留下你们的邮箱 xff0c 我会把相关内容私发给你们 收到邮件
  • c++继承详解之一——继承的三种方式、派生类的对象模型

    C 43 43 是OOP xff08 Object Oriented Programming xff09 语言 xff0c 即面向对象编程语言 OOP的核心思想就是数据抽象 xff08 类的设计 xff09 xff0c 继承和动态绑定 类展
  • ZED2跑ORB-SLAM3+双目相机、IMU联合标定+显卡驱动与cuda/cudnn安装

    一 引言 同样是项目需求 xff0c 需要利用视觉惯性导航做一些开发 xff0c 所以第一步先做些算法的测试 仿真与实物测验 xff0c 通过仿真的测试结果 xff0c 最终是决定使用ORB SLAM3来完成任务 xff0c 当然了 xff
  • FreeRTOS学习笔记——任务删除 vTaskDelete() API

    任务可以使用API函数 vTaskDelete 删除自己或其他任务 空闲任务的责任是要将分配给已删除任务的内存释放掉 注意 xff1a 只有内核为任务分配的内存空间才会在任务被删除后自动回收 xff0c 任务自己占用的内存或资源需要由应用程
  • mac 安装jd-gui

    https blog csdn net daicaho article details 81141251 使用brew安装 xff0c 打开终端窗口 xff0c 输入下面命令 brew cask install jd gui 如果提示 br

随机推荐

  • 统计降尺度与动力学降尺度

    1 统计降尺度 xff1a 1 1 概念解释 xff1a 统计降尺度 也称为经验降尺度 xff0c 是由大尺度气候信息获取小尺度气候信息的有力工具 他可被视作是与动力降尺度平行的降尺度方法 xff0c 或者可被看做是动力降尺度的补充 1 2
  • 无人驾驶技术之激光雷达市场分析

    无人驾驶技术之激光雷达市场分析 LiDAR Light Detection And Ranging xff0c 即激光雷达 xff0c 是利用激光 全球定位系统GPS和惯性测量装置 xff08 IMU xff09 三者合一 xff0c 获得
  • 线性系统理论——状态观测器状态反馈

    在学习现代控制理论的时候 xff0c 想必大家都学过状态观测器这个东西 状态观测器的作用就是在实际控制系统某些地方不方便或者不能加传感器的时候 xff0c 对系统的各部分状态做一个估计 xff0c 这个估计一般是通过系统输出推导后得到的 为
  • 【wzdftpd安装】wzdftpd的linux版本安装教程

    近期要开展漏洞挖掘的工作 xff0c 因此需要安装wzdftpd在机器上 xff0c 又因为这个东西比较老 xff0c 自己各种摸索之下终于搞定它的安装流程了 xff0c 现在记录一下 一 下载地址 https sourceforge ne
  • 树莓派——镜像篇

    因为某些原因 xff0c 我又得重新配置树莓派环境了 xff0c 官网链接在这里 xff1a 点击 顺便一提 xff0c 有三个版本 xff0c 选择 Raspbian Buster with desktop xff0c 这个是带有桌面的
  • 树莓派——网络连接篇

    树莓派一连上电源就会开始亮灯 xff0c 通常有两盏灯 xff0c 一盏是红色的 xff0c 一盏是绿色的 xff0c 详见灯的意义在这篇博文里面有 点击 我认识的树莓派显示方式以及网络连接方式各有两种 xff1a 界面显示方式 xff1a
  • 19年电赛经验总结

    1 今年带了两个学弟 xff0c 结果他两因为从来没有这样子熬夜过导致晚上脑子转不动 xff0c 相当于晚上就不能熬夜的状态 总结 xff1a 还是要做好准备 xff0c 你平时没有晚上干活干到这个点可能还是不能想象当时的状态的 2 电赛清
  • 树莓派——opencv篇

    1 查看python3的版本 如果是python3 5的 xff0c 请使用这个教程 xff1b 如果是python3 7的 xff0c 请使用这个教程 2 错误集合 遇到了以下的情况 xff0c 请参考https blog csdn ne
  • 毕业季——找工作必备APP

    整理了一些在我找工作的时候对我帮助挺大的APP 1 前程无忧51Job xff1a 我通常在这里面看附近大学的宣讲会安排 xff0c 蛮方便的 xff0c 比我在一个一个学校官网看信息好多了 2 BOSS直聘 拉钩招聘 xff1a 在里面看
  • 运行虚拟机卡在booting the kernel

    最近在学宋宝华的 linux设备驱动开发详解 在配置环境的时候 xff0c 按照给的工具包安装了 VMware player 7 0 0 2305329 1420626349 exe 然后就按照流程一步一步的照做 xff0c 到了最后一步运
  • eclipse与华为云之间push代码的相关问题汇总

    1 直接反馈连接超时 Transport Error Cannot get remote repository refs http codehub devcloud cn north 4 huaweicloud com ssm shoppi
  • 饿

    以为有片海苔在我桌子上 xff0c 正眼一看 xff0c 原来是一片charger ic
  • 【小记】个人面试总结

    时间 xff1a 2023 5 10晚线上 岗位 xff1a Linux软件工程师 公司名字 xff08 直接写出来会不会不太好哇 xff09 深圳光明某初创公司 这是近两个月面试的第一家公司 xff0c 我是对这个公司名字 xxx新能源以
  • Ubuntu操作系统配置阿里云镜像方法一

    Ubuntu xff0c 是一款基于 Debian Linux 的以桌面应用为主的操作系统 xff0c 内容涵盖文字处理 电子邮件 软件开发工具和 Web 服务等 xff0c 可供用户免费下载 使用和分享 阿里云官方镜像站 xff1a ht
  • 关于在Ardusub-Raspberry镜像中ssh密码错误access denied问题

    环境 xff1a Win10 在此感谢论坛大佬的回答 xff0c 一下附上原网址 http rovmaker cn t topic 1272 在ArduSub入门教程 树莓派设置中 xff0c 本人按照上面的教程 xff0c 当完成相应步骤
  • O2OA中如何使用PostgreSQL + Citus 实现分布式数据库实现方案?

    虽然 O2OA 数据表高效的表结构以及索引的设计已经极大程度地保障了数据存取操作的性能 xff0c 但是随着使用时间从增长 xff0c 数据表存放的数据量也会急剧增长 此时 xff0c 仍然需要有合适的方案来解决数据量产生的系统性能瓶颈 本
  • 我的2013——学习、工作与生活

    一直觉得应该写阶段性总结 xff0c 以知道自己这段时间在干什么 xff0c 下一个阶段该干什么 xff0c 没实施过 xff1b 一直觉得学技术就应该多些博客 xff0c 以和同行共同学习交流 xff0c 分享是美德 xff0c 也是对
  • POI Excel导出样式设置

    HSSFSheet sheet 61 workbook createSheet 34 sheetName 34 创建sheet sheet setVerticallyCenter true 下面样式可作为导出左右分栏的表格模板 sheet
  • SQL强化:将相同的或连续的时间段合并

    问题描述 xff1a 有一张签到表 xff0c 需要将连续或相同的时间段合并 xff0c 即把多条记录查询合并成一条连续的时间段记录 数据表如下 xff1a DROP TABLE IF EXISTS 96 timesheets 96 CRE
  • Mysql实现数据的不重复写入(insert if not exists)以及新问题:ID自增不连续的解答

    最近做数据处理时候 xff0c 遇到一个问题 用一个id自增主键时候 xff0c 数据表中会插入大量重复数据 xff08 除ID不同 xff09 这虽然对最终数据处理结果没有影响 xff0c 但是有1个问题 xff0c 如果数据量超大 xf