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

我们插入数据的时候,有可能碰到重复数据插入的问题,那么MySQL主键唯一键重复插入如何解决,本文就详细的来介绍一下,感兴趣的可以了解一下

我们插入数据的时候,有可能碰到重复数据插入的问题,但是这些数据又是不被允许有重复值:

?

1

2

3

4

5

6

7

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='学生表';

?

1

2

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)重复时自动忽略重复的记录行,不影响后面的记录行的插入。

?

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

2

3

4

5

6

7

8

9

10

11

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当插入的记录遇到主键或者唯一键重复时先删除表中重复的记录行再插入。

?

1

2

3

4

5

6

7

8

9

10

11

12

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操作。

?

1

2

3

4

5

6

7

8

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)第一种情形:

?

1

2

#VALUES(age) 待插入值 25

INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25) ON DUPLICATE KEY UPDATE age = VALUES(age) + 1;

相当于:

?

1

2

3

4

INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20);

UPDATE stuInfo

SET age = VALUES(age) + 1

WHERE id = 1;

运行结果:

?

1

2

3

4

5

6

7

8

9

10

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)第二种情形:

?

1

2

#age 已插入值 20

INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20),(1,'xiaosi',25) ON DUPLICATE KEY UPDATE age = age + 1;

相当于:

?

1

2

3

4

INSERT INTO stuInfo (id,name,age) VALUES (1,'yoona',20);

UPDATE stuInfo

SET age = age + 1

WHERE id = 1;

运行结果:

?

1

2

3

4

5

6

7

8

9

10

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主键唯一键重复插入内容请搜索钦钦技术栈以前的文章或继续浏览下面的相关文章希望大家以后多多支持钦钦技术栈!

原文链接:https://blog.csdn.net/SunnyYoona/article/details/51346593

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/5588/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022-07-25 6:30:08
下一篇 2022-07-26 9:58:10

软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!