mysql主键唯一键重复插入解决方法
来源:互联网 发布:蓝天超频软件 编辑:程序博客网 时间:2024/05/16 19:26
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)
转载自:http://blog.csdn.net/SunnyYoona/article/details/51346593
- mysql主键唯一键重复插入解决方法
- [MySQL日记]主键唯一键重复插入解决方法
- mysql 插入数据是主键或唯一值重复的解决方法
- powerdesigner设置mysql唯一键,非主键
- mysql生成唯一主键
- 主键重复插入
- mysql中的唯一键索引,插入重复数据直接报错的解决办法
- MySql避免重复插入记录(根据主键判重)
- MySQL自增主键删除后插入新记录主键重复问题
- mysql insert 主键重复
- 主键、唯一键、外键
- Java--批量插入更新在一条sql里解决-mybatis-mysql-联合主键(建立唯一索引)
- 【mysql】sql删除多个字段重复数据有主键和没主键解决方法
- 插入数据之后获得表唯一主键
- mysql(5.6)分区(一)分区键,主键和唯一键
- mysql 主键,外键,唯一键,索引的区别
- MySQL添加/删除主键、外键、唯一键、索引、自增
- sqlserver 当删除表中的所有记录后插入记录时提示主键不唯一的解决方法
- java杂记
- Centos7+Mysql5.7实现主从复制
- 1
- 采用变量方式统一管理maven的jar包版本
- java创建线程的三种方式及其对比
- mysql主键唯一键重复插入解决方法
- bzoj 5070: 危险的迷宫
- 析构函数报错
- rn的组件textinput用做searchbar的坑
- 学习心得2017.12.20
- pixhawk commander--navigator--modules之间的联系
- Unity性能优化全攻略
- TablayoutDemo
- 代码效率