当前位置:Gxlcms > 数据库问题 > [MySQL日记]主键唯一键重复插入解决方法

[MySQL日记]主键唯一键重复插入解决方法

时间:2021-07-01 10:21:17 帮助过:4人阅读

(
  • 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=‘学生表‘;

    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. 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. 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. 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. 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. 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. #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. INSERT INTO stuInfo (id,name,age) VALUES (1,‘yoona‘,20);
    2. UPDATE stuInfo
    3. SET age = VALUES(age) + 1
    4. WHERE id = 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. #age 已插入值 20
    2. INSERT INTO stuInfo (id,name,age) VALUES (1,‘yoona‘,20),(1,‘xiaosi‘,25) ON DUPLICATE KEY UPDATE age = age + 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. 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:<

    人气教程排行