在项目过程中因需要大批量数据的insert or update操作,为了减少应用程序的校验逻辑,所以使用了mysql 的特殊语法insert into … on duplicate key update。用于解决出现相同的主键执行update ,不同主键执行新增。

在测试过程中发现一个小坑,在网上的技术文档中都写的是(当记录中有PrimaryKey或者unique索引的话,如果数据库已经存在数据,则用新数据更新)当时理解错误,理解成会按其中一种进行处理。

实际情况是mysql会先使用UQ更新,如果没有UQ然后才用PK更新。所以我遇到了因为UQ相同,PK不同导致触发了数据的update导致数据错误。

下边增加一个测试说明:

# 创建测试表

drop table if EXISTS `insert_or_update`;

CREATE TABLE `insert_or_update` (

`id` int(5) NOT NULL auto_increment,

`code` varchar(40) not null ,

`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,

`age` int(4) DEFAULT NULL,

PRIMARY KEY (`id`),

unique index (`code`) comment '唯一编码'

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

# 初始化数据

insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(1,'code1','名字1',10);

insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(2,'code2','名字2',10);

insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(3,'code3','名字3',10);

insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(4,'code4','名字4',10);

mysql insert or update 共有4重方式

# 1. insert ignore into(重复则忽略,不重复则插入)

# 主键重复

insert ignore into `insert_or_update` (`id`,`code`,`name`,`age`) values(4,'code4','名字4',10);

# UQ重复

insert ignore into `insert_or_update` (`id`,`code`,`name`,`age`) values(5,'code4','名字4',10);

# 不重复直接插入

insert ignore into `insert_or_update` (`id`,`code`,`name`,`age`) values(5,'code5','名字4',10);

# 2. replace into (重复则先删除再插入新记录,不重复则插入)

# 主键重复

replace into `insert_or_update` (`id`,`code`,`name`,`age`) values(4,'code4','名字4 replace',10);

# UQ重复

replace into `insert_or_update` (`id`,`code`,`name`,`age`) values(5,'code5','名字5 replace',10);

# 3. insert into … on duplicate key update(重复则更新指定字段,不重复则插入)

# 主键重复

insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(4,'code4','名字4 duplicate key update',10)

on duplicate key update name = values(`name`);

# UQ重复

insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(5,'code5','名字5 duplicate key update',10)

on duplicate key update name = values(`name`);

注意:当一个表同时有UQ与PK时一定注意避免掉坑。

mysql 索引 insert_Mysql 大批量数据insert or update与UQ索引相关推荐

  1. mysql mediumblob insert_mysql - 死锁BLOB INSERT MySQL 8.0 InnoDB集群 - 堆栈内存溢出

    当使用配置好的InnoDB集群复制将较大的文件插入MySQL 8.0数据库时,查询会遇到表死锁. 对于较小的6 KB文件,可以使用INSERT. 通过MySQL路由器运行以及通过直接连接到" ...

  2. mysql 优化配置 大批量数据插入_php导入大量数据到mysql性能优化技巧

    本文实例讲述了php导入大量数据到mysql性能优化技巧.分享给大家供大家参考.具体分析如下: 在mysql中我们结合php把一些文件导入到mysql中,这里就来分享一下我对15000条记录进行导入时 ...

  3. mysql 优化配置 大批量数据插入_MYSQL开发性能研究——批量插入的优化措施

    一.我们遇到了什么问题 在标准SQL里面,我们通常会写下如下的SQL insert语句. INSERT INTO TBL_TEST (id) VALUES(1); 很显然,在MYSQL中,这样的方式也 ...

  4. mysql 优化配置 大批量数据插入_[译] MySQL 最佳实践 —— 高效插入数据

    当你需要在 MySQL 数据库中批量插入数百万条数据时,你就会意识到,逐条发送 INSERT 语句并不是一个可行的方法. MySQL 文档中有些值得一读的 INSERT 优化技巧. 在这篇文章里,我将 ...

  5. 怎么运用索引查处mysql表中的数据_深入理解MySQL数据库索引原理及实现,快速检索数据库 MySQL数据库使用教程...

    免费学习推荐: 一.索引的概念 1.索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址 (类似于C语言的链表通过指针指向数据记录的内存地址) . 2.使用索引后可以不用 ...

  6. oracle大批量数据统计,加速Oracle大批量数据处理的2个好用方案

    其实加速Oracle大批量数据处理并不困难,你选择的实际应用方案很重要,以下的文章主要是对解决加速Oracle大批量数据处理的2个方案的介绍,即,提高DML操作的办法还有各种批量DML操作. 一.加速 ...

  7. TiDB 作为 MySQL Slave 实现实时数据同步

    由于 TiDB 本身兼容绝大多数的 MySQL 语法,所以对于绝大多数业务来说,最安全的切换数据库方式就是将 TiDB 作为现有数据库的从库接在主 MySQL 库的后方,这样对业务方实现完全没有侵入性 ...

  8. 【MySQL】索引优化中的最左前缀原则和索引下推

    目录 一.引入 二.覆盖索引 ​ 讲接下来的问题前首先讲一下联合索引的底层存储结构长什么样?联合索引的检索过程是什么样的呢? 三.最左前缀原则 最左前缀原则的定义 四.索引下推 五.小结 一.引入 在 ...

  9. 聚集索引表插入数据和删除数据的方式是怎样的

    当插入记录的时候,或者重新组织索引的时候都会按照字段顺序来排序 今天来做一个实验来验证一下 --------------------------------------------------华丽的分 ...

  10. php mysql取出来,php从mysql数据库中取数据

    php从数据库中取数据  面向过程 $server_name="localhost:3306"; //数据库服务器名称 $username="root"; // ...

最新文章

  1. 虚拟化技术KVM的搭建
  2. linux下使用rdesktop连接远程windows
  3. jQuery.inArray()方法
  4. Python小白的数学建模课-15.图论的基本概念
  5. 读《驯服烂代码——在编程操练中悟道》
  6. CString 是一种很有用的数据类型
  7. java面试准备---JSF系统学习知识点总结---随时更新
  8. 利息高的贷款通过率会高一些吗?
  9. HDU 1114 iggy-Bank(完全背包)
  10. Ubuntu源码安装Tomcat7
  11. BSGS-BabyStepGiantStep算法+拓展
  12. python自动化操作微信_利用Python实现微信半自动化操作!
  13. 支付宝登录java_支付宝登录java和android
  14. 使用Tracup中的时间阻塞,提升工作效率(完整指南)
  15. 简单的基于规则的汉语拼音分词
  16. 多张照片怎么做成动图
  17. java的生活状态,生活状态 - Dorian's Blog - BlogJava
  18. 六方ZnS包裹碳纳米管复合粉体/PbS纳米晶原位包裹碳纳米管的复合材料/壳聚糖包裹的多壁碳纳米管
  19. 【二叉树】根据后续和中序遍历输出前序遍历 [建树+非建树做法]
  20. 形态学操作之腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽和黑帽

热门文章

  1. 储存卡格式化怎么恢复?给力的操作!
  2. Android 10.0在电话拨号盘(Dialer app中)通过暗码进入工厂测试模式
  3. 【英语:基础高阶_全场景覆盖表达】K6.口语主题陈述——人物类
  4. 射频混频器matlab,射频(RF)采样:数字混频器能使混频操作妙趣横生
  5. android怎么删除插件,Android手机如何添加删除桌面图标和插件
  6. 19.flowable 任务委派
  7. python中新建标签页的三种方法
  8. Spug“账户已被系统禁用”的解决办法
  9. 六、股票市场分析实战项目一
  10. No symbols loaded