主键唯一键重复插入解决方法

[MySQL日记]主键唯一键重复插入解决方法
我们插入数据的时候,有可能碰到重复数据插入的问题,但是这些数据又是不被允许有重复值:

?


1
  1. CREATE TABLE stuInfo (
  2. id INT NOT NULL COMMENT ‘序号‘,
  3. name VARCHAR(20) NOT NULL DEFAULT ‘‘ COMMENT ‘姓名‘,
  4. age INT NOT NULL DEFAULT 0 COMMENT ‘年龄‘,
  5. PRIMARY KEY (id),
  6. UNIQUE KEY uniq_name(name)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘学生表‘;

?


1
  1. mysql> INSERT INTO stuInfo (id,name,age) VALUES (1,‘yoona‘,20),(1,‘xiaosi‘,25),(2,‘aa‘,24);
  2. ERROR 1062 (23000): Duplicate entry ‘1‘ for key ‘PRIMARY‘

解决方案:

1. IGNORE

使用ignore当插入的值遇到主键(PRIMARY KEY)或者唯一键(UNIQUE KEY)重复时自动忽略重复的记录行,不影响后面的记录行的插入。

?


1
  1. INSERT IGNORE INTO stuInfo (name,birthday,is_deleted) VALUES (‘yoona‘,‘1990-01-05‘,0),(‘aa‘,‘1990-01-16‘,0),(‘bb‘,‘1990-01-17‘,0);

运行结果:

?


1
  1. mysql> INSERT IGNORE INTO stuInfo (id,name,age) VALUES (1,‘yoona‘,20),(1,‘xiaosi‘,25),(2,‘aa‘,24);
  2. Query OK, 2 rows affected (0.02 sec)
  3. Records: 3 Duplicates: 1 Warnings: 0
  4. mysql> select * from stuInfo;
  5. +----+-------+-----+
  6. | id | name | age |
  7. +----+-------+-----+
  8. | 1 | yoona | 20 |
  9. | 2 | aa | 24 |
  10. +----+-------+-----+
  11. 2 rows in set (0.00 sec)

我们可以从运行结果中看出,只有两行受到影响,意思即(1,‘yoona‘,20)数据插入,(1,‘xiaosi‘,25)重复数据自动被忽略,(2,‘aa‘,24)不重复数据继续插入,不会受到重复数据的影响;

2.REPLACE

使用replace当插入的记录遇到主键或者唯一键重复时先删除表中重复的记录行再插入。

?


1
  1. mysql> REPLACE INTO stuInfo (name,birthday,is_deleted) VALUES (‘yoona‘,‘1990-01-15‘,0),(‘yoona‘,‘1990-02-16‘,0),(‘aa‘,‘1990-01-13‘,0);
  2. Query OK, 4 rows affected (0.02 sec)
  3. Records: 3 Duplicates: 1 Warnings: 0

运行结果:

?


1
  1. mysql> select * from stuInfo; +----+-------+------------+------------+
  2. | id | name | birthday | is_deleted |
  3. +----+-------+------------+------------+
  4. | 21 | yoona | 1990-02-16 | 0 |
  5. | 22 | aa | 1990-01-13 | 0 |
  6. +----+-------+------------+------------+
  7. 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操作。

?


1
  1. DROP TABLE IF EXISTS stuInfo;
  2. CREATE TABLE stuInfo (
  3. id INT NOT NULL COMMENT ‘序号‘,
  4. name VARCHAR(20) NOT NULL DEFAULT ‘‘ COMMENT ‘姓名‘,
  5. age INT NOT NULL DEFAULT 0 COMMENT ‘年龄‘,
  6. PRIMARY KEY (id),
  7. UNIQUE KEY uniq_name(name)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘学生表‘;

在ON DUPLICATE KEY UPDATE后VALUES解释:

VAULES(age)指的是待插入的记录的值

age指得是表的自身值,已插入值。

(1)第一种情形:

?


1
  1. #VALUES(age) 待插入值 25
  2. INSERT INTO stuInfo (id,name,age) VALUES (1,‘yoona‘,20),(1,‘xiaosi‘,25) ON DUPLICATE KEY UPDATE age = VALUES(age) + 1;

相当于:

?


1
  1. INSERT INTO stuInfo (id,name,age) VALUES (1,‘yoona‘,20);
  2. UPDATE stuInfo
  3. SET age = VALUES(age) + 1
  4. WHERE id = 1;

运行结果:

?


1
  1. mysql> INSERT INTO stuInfo (id,name,age) VALUES (1,‘yoona‘,20),(1,‘xiaosi‘,25) ON DUPLICATE KEY UPDATE age = VALUES(age) + 1;
  2. Query OK, 3 rows affected (0.01 sec)
  3. Records: 2 Duplicates: 1 Warnings: 0
  4. mysql> select * from stuInfo;
  5. +----+-------+-----+
  6. | id | name | age |
  7. +----+-------+-----+
  8. | 1 | yoona | 26 |
  9. +----+-------+-----+
  10. 1 row in set (0.00 sec)

(2)第二种情形:

?


1
  1. #age 已插入值 20
  2. INSERT INTO stuInfo (id,name,age) VALUES (1,‘yoona‘,20),(1,‘xiaosi‘,25) ON DUPLICATE KEY UPDATE age = age + 1;

相当于:

?


1
  1. INSERT INTO stuInfo (id,name,age) VALUES (1,‘yoona‘,20);
  2. UPDATE stuInfo
  3. SET age = age + 1
  4. WHERE id = 1;

运行结果:

?


1
  1. mysql> INSERT INTO stuInfo (id,name,age) VALUES (1,‘yoona‘,20),(1,‘xiaosi‘,25) ON DUPLICATE KEY UPDATE age = age + 1;
  2. Query OK, 3 rows affected (0.02 sec)
  3. Records: 2 Duplicates: 1 Warnings: 0
  4. mysql> select * from stuInfo;
  5. +----+-------+-----+
  6. | id | name | age |
  7. +----+-------+-----+
  8. | 1 | yoona | 21 |
  9. +----+-------+-----+
  10. 1 row in set (0.00 sec)

如果遇到重复插入的数据的情形,ON DUPLICATE KEY UPDATE用来对已插入的数据进行修改,可以使用获取重复已插入数据(直接使用字段名称),也可以获取重复待插入数据(values(字段名称))。我们不会对重复待插入数据进行插入操作。

重复已插入数据:上例中的(1,‘yoona‘,20)

重复待插入数据:上例中的(1,‘yoona‘,25)

时间: 2024-10-31 01:02:33

主键唯一键重复插入解决方法的相关文章

[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 D

MySQL 处理插入过程中的主键唯一键重复值办法

200 ? "200px" : this.width)!important;} --> 介绍 本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE:接下来就分别看看这三种方式的处理办法. IGNORE 使用ignore当插入的值遇到主键(PRIMARY KEY)或者唯一键(UNIQUE KEY)重复时自动忽略重复的记录行,不影响后面的记录行的插入, 创建测试表 CREATE TA

SQL多个主键的表,插入数据有重复时,查询数据的重复值?

SQL多个主键的表,插入数据有重复时,会提示违反主键约束不能插入的错误.那么,如何找到插入数据的重复值? 解决方法:使用group by 假设有个表#a,有saleid,vendorid,comid,price,saleprice,quantity等字段. 主键是:saleid,vendorid,comid三个.假设插入#a的数据源可能会有重复的. 即:saleid,vendorid,comid三个字段都一样的字段,那么插入#a的时候会报主键冲突,违反主键约束. 如果想找出#a表中插入重复的值可

MySql避免重复插入记录方法(ignore,Replace,ON DUPLICATE KEY UPDATE)

本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,各位同学可尝试参考. 案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用:  代码如下 复制代码 1 INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('[email protec

【求助】因为相同类型的其他实体已具有相同的主键值。在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 。。。

因为相同类型的其他实体已具有相同的主键值.在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为.这可能是因为某些实体是新的并且尚未接收数据库生成的键值.在此情况下,使用 "Add" 方法或者 "Added" 实体状态跟踪该图形,然后将非新实体的状态相应设置为 "Unchanged"

oracle分页查询结果集重复问题&解决方法

做项目时,无意间发现了分页上的一个bug,在此记录一下: 首先手动将后台输出的sql语句复制进oracle中查看,以便排查错误,对比以下视图前10条的结果集与10到20条的结果集,发现大部分记录出现重复现象,SQL语句如下: --前10条记录 select *   from (select row_.*, rownum rownum_           from (select t.idcard, count(1)                   from sampling.v_unvou

【系统Configmachine.config与自己的应用程序的App.config/Web.Config配置节点重复】解决方法

自己的应用程序的App.config或Web.Config文件中与系统的C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Configmachine.config文件1.重复如下配置: <DbProviderFactories> <add name="MySQL Data Provider2" invariant="MySql.Data.MySqlClient" description=".N

mysql主键和唯一键重复的用法

表名heyf_t10,用来测试的语句为 INSERT INTO heyf_t10 ( empid, deptid, salary)VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE empid = 1, deptid = 2, salary = 5 原始数据为 如图,唯一键这样设置,那么执行上面的sql后,因为触动了某个唯一键 如果唯一键如下图设置,原始数据和结果数据如下,原因是联合为一键,必须都重复才走进update语句,此为联合唯一键 如果是设置为主键的话,效果

Mybatis+Mysql插入数据库返回自增主键id值的三种方法

一.场景: 插入数据库的值需要立即得到返回的主键id进行下一步程序操作 二.解决方法: 第一种:使用通用mapper的插入方法 Mapper.insertSelective(record): 此方法:插入一条数据,只插入不为null的字段,不会影响有默认值的字段支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)优先使用传入的参数值,参数值空时,才会使用序列.UUID,自动增长 controller的实际应用:使用方法id会直接将映射到参数的实体上使用时直接使用