mysql insert or update与UQ索引
时间:2022-07-28
本文章向大家介绍mysql insert or update与UQ索引,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在项目过程中因需要大批量数据的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时一定注意避免掉坑。
- Struts Interceptor Example
- 微信服务号模板消息接口新增"设置行业"和"添加模板"及细节优化
- WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter
- WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法
- WPF文字修饰——上、中、下划线与基线
- 微信公众平台数据接口正式对所有认证公众号开放
- 参考基因组没有,经费也没那么多,怎么办?
- .Net下SQLite的DBHelp
- 数据库进程间通信解决方案之MQ
- 【学术】算法交易的神经网络:强化经典策略
- java.util.logging 例子
- WPF命令(Command)介绍、命令和数据绑定集成应用
- lncRNA实战项目-第六步-WGCNA相关性分析
- 【项目】Github上的一个简单项目:用人工智能预测大学录取概率
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Netty之旅二:口口相传的高性能Netty到底是什么?
- 前端知识复习(一)
- Powershell运行脚本报错:此系统上禁止运行脚本
- git rebase解决合并冲突
- npm相关操作
- Angular html property的值如何被更新的
- Centos 7 使用mailx发送邮件
- Centos 7 备份MySQL
- Centos 7 备份MySQL/MongoDB并发邮件脚本
- Nginx启动报错:sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object
- 有赞美业店铺装修前端解决方案
- nginx部署react项目
- Golang 标准库 限流器 time/rate 设计与实现
- Node搭建简易的UDP服务器
- cordova run android 下载gradle报timeout