MySQL主键唯一键重复插入解决方法
我们插入数据的时候,有可能碰到重复数据插入的问题,但是这些数据又是不被允许有重复值:
- CREATE TABLE stuInfo (
- id INT NOT NULL COMMENT '序号',
- name VARCHAR(20) NOT NULL DEFAULT '' COMMENT '姓名',
- age INT NOT NULL DEFAULT 0 COMMENT '年龄',
- PRIMARY KEY (id),
- UNIQUE KEY uniq_name(name)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生表';
- mysql> INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25),(2,'aa',24);
- ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
解决方案:
1. IGNORE
使用ignore当插入的值遇到主键(PRIMARY KEY)或者唯一键(UNIQUE KEY)重复时自动忽略重复的记录行,不影响后面的记录行的插入。
- INSERT IGNORE INTO stuInfo (name,birthday,is_deleted) VALUES ('yoona','1990-01-05',0),('aa','1990-01-16',0),('bb','1990-01-17',0);
运行结果:
- mysql> INSERT IGNORE INTO stuInfo (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25),(2,'aa',24);
- Query OK, 2 rows affected (0.02 sec)
- Records: 3 Duplicates: 1 Warnings: 0
- mysql> select * from stuInfo;
- +----+-------+-----+
- | id | name | age |
- +----+-------+-----+
- | 1 | yoona | 20 |
- | 2 | aa | 24 |
- +----+-------+-----+
- 2 rows in set (0.00 sec)
我们可以从运行结果中看出,只有两行受到影响,意思即(1,'yoona',20)数据插入,(1,'xiaosi',25)重复数据自动被忽略,(2,'aa',24)不重复数据继续插入,不会受到重复数据的影响;
2. REPLACE
使用replace当插入的记录遇到主键或者唯一键重复时先删除表中重复的记录行再插入。
- mysql> REPLACE INTO stuInfo (name,birthday,is_deleted) VALUES ('yoona','1990-01-15',0),('yoona','1990-02-16',0),('aa','1990-01-13',0);
- Query OK, 4 rows affected (0.02 sec)
- Records: 3 Duplicates: 1 Warnings: 0
运行结果:
- mysql> select * from stuInfo; +----+-------+------------+------------+
- | id | name | birthday | is_deleted |
- +----+-------+------------+------------+
- | 21 | yoona | 1990-02-16 | 0 |
- | 22 | aa | 1990-01-13 | 0 |
- +----+-------+------------+------------+
- 2 rows in set (0.00 sec)
从输出的信息可以看到是4行受影响,说明它是先插入了('yoona','1990-01-15',0)然后又删除了('yoona','1990-01-15',0)。
3. ON DUPLICATE KEY UPDATE
当插入的记录遇到主键或者唯一键重复时,会执行后面定义的UPDATE操作。相当于先执行Insert 操作,再根据主键或者唯一键执行update操作。
- DROP TABLE IF EXISTS stuInfo;
- CREATE TABLE stuInfo (
- id INT NOT NULL COMMENT '序号',
- name VARCHAR(20) NOT NULL DEFAULT '' COMMENT '姓名',
- age INT NOT NULL DEFAULT 0 COMMENT '年龄',
- PRIMARY KEY (id),
- UNIQUE KEY uniq_name(name)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学生表';
在ON DUPLICATE KEY UPDATE后VALUES解释:
VAULES(age)指的是待插入的记录的值
age指得是表的自身值,已插入值。
(1)第一种情形:
- #VALUES(age) 待插入值 25
- INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25) ON DUPLICATE KEY UPDATE age = VALUES(age) + 1;
相当于:
- INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20);
- UPDATE stuInfo
- SET age = VALUES(age) + 1
- WHERE id = 1;
运行结果:
- mysql> INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25) ON DUPLICATE KEY UPDATE age = VALUES(age) + 1;
- Query OK, 3 rows affected (0.01 sec)
- Records: 2 Duplicates: 1 Warnings: 0
- mysql> select * from stuInfo;
- +----+-------+-----+
- | id | name | age |
- +----+-------+-----+
- | 1 | yoona | 26 |
- +----+-------+-----+
- 1 row in set (0.00 sec)
(2)第二种情形:
- #age 已插入值 20
- INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25) ON DUPLICATE KEY UPDATE age = age + 1;
相当于:
- INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20);
- UPDATE stuInfo
- SET age = age + 1
- WHERE id = 1;
运行结果:
- mysql> INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25) ON DUPLICATE KEY UPDATE age = age + 1;
- Query OK, 3 rows affected (0.02 sec)
- Records: 2 Duplicates: 1 Warnings: 0
- mysql> select * from stuInfo;
- +----+-------+-----+
- | id | name | age |
- +----+-------+-----+
- | 1 | yoona | 21 |
- +----+-------+-----+
- 1 row in set (0.00 sec)
如果遇到重复插入的数据的情形,ON DUPLICATE KEY UPDATE用来对已插入的数据进行修改,可以使用获取重复已插入数据(直接使用字段名称),也可以获取重复待插入数据(values(字段名称))。我们不会对重复待插入数据进行插入操作。
重复已插入数据:上例中的(1,'yoona',20)
重复待插入数据:上例中的(1,'yoona',25)
MySQL主键唯一键重复插入解决方法相关推荐
- mysql 导入主键冲突_MySQL 处理插入过程中的主键唯一键重复值的解决方法
本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE:接下来就分别看看这三种方式的处理办法. IG ...
- MySQL 处理插入重主键唯一键重复值办法
本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE:接下来就分别看看这三种方式的处理办法. IG ...
- DB2添加数据时主键、唯一键冲突的解决方法
DB2添加数据时主键.唯一键冲突的解决方法 参考文章: (1)DB2添加数据时主键.唯一键冲突的解决方法 (2)https://www.cnblogs.com/equation/articles/91 ...
- MySQL 主键冲突,无法插入数据
1.若主键没有设置自增长,也会出现Duplicate entry '8388607' for key 'PRIMARY': 2.问题: 开发来电话说仓库无法下单,程序插入数据提示:入库单 xxxx15 ...
- springboot 主键重复导致数据重复_程序员:MySQL处理插入过程中主键或唯一键重复值的解决办法
向MySQL插入数据有时会遇到主键重复的场景,原来的做法是先在程序代码中SELECT一下,判断是否存在指定主键或唯一键的数据,如果没有则插入,有的话则执行UPDATE操作,或另外一套逻辑,这种方法是不 ...
- MySQL处理插入过程中主键或唯一键重复值的解决办法
向MySQL插入数据有时会遇到主键重复的场景,原来的做法是先在程序代码中SELECT一下,判断是否存在指定主键或唯一键的数据,如果没有则插入,有的话则执行UPDATE操作,或另外一套逻辑,这种方法是不 ...
- mysql设置主键自增长,插入数据时报错,解决
mysql设置主键自增长,插入数据时报错,解决 创建一个可以自增长的表 create table user ( sid int not null primary key auto_inrement, ...
- mysql 主键冲突 多个事务回滚_MySQL实战45讲Day38----自增主键不是连续的原因
一.自增主键不连续的原因: 对于表: CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c` int(11) DEFAULT NULL ...
- MySQL主键、普通索引和唯一索引的区别、全文索引
1 概念区分 普通索引 V.S 唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,人为规定该字段不得重复,那么就使用唯一索引.( ...
最新文章
- 【每日DP】day 9、P1156 垃圾陷阱(神奇的背包,时间节点处理)难度⭐⭐⭐
- java 时分秒比较_小学三年级数学上册《时分秒》一课一练,含答案,巩固此知识点!...
- TensorFlow随笔-多分类单层神经网络softmax
- Docker-操作容器1
- python里的resize_利用python之wxpy模块玩转微信!这部小儿科吗!
- Javascript正则表达式完全学习手册
- 2019蓝桥杯省赛---java---C---6(旋转)
- MySQL的mysql_insert_id和LAST_INSERT_ID
- 荣耀es升级鸿蒙,华为手机明年全部升级鸿蒙系统 所有自研设备换OS
- XSL样式,分页方法
- Linux-kernel 网桥代码分析(一)
- 我推荐的一些C\C++书籍
- 中国数字电视视频信号基本参数
- 【Django 2021年最新版教程21】数据库查询 model 多条数据 queryset转dict字典 返回渲染到前端
- 软件工程——团队作业2
- 补码加法器中低位进位信息是什么?
- 流体动力学控制方程(详细推导)
- win11 应用程序无法获取麦克风的声音
- 2021-05-31 elem笔记
- 2023.04.27 QT 制作文本编辑器
热门文章
- 【Python基础】Matplotlib官方小抄手册公开(配套可视化代码)!
- 复现经典:《统计学习方法》第13章 无监督学习概论
- 统计学习方法第五章作业:ID3/C4.5算法分类决策树、平方误差二叉回归树代码实现
- 行业观察|智慧屏集中爆发,大屏市场能否迎来破局者?
- KandQ:那年,那树,那些知识点
- 《Adobe SiteCatalyst网站分析权威手册》一1.3 SiteCatalyst是怎么工作的
- 关于android的几个小知识点
- spring mvc(注解)上传文件的简单例子
- Inspector a ProgressBar(定制属性面板)
- nginx随机变换图片服务器网址来防止盗链