请选择 进入手机版 | 继续访问电脑版

[MySql] 详解MySQL主键唯一键重复插入办理 方法

[复制链接]
查看120 | 回复13 | 2021-9-12 23:29:01 | 显示全部楼层 |阅读模式
目次

我们插入数据的时间 ,有大概 遇到 重复数据插入的题目 ,但是这些数据又是不被答应 有重复值:

  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. 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
  4. 运行结果:
  5. mysql> select * from stuInfo; +----+-------+------------+------------+
  6. | id | name | birthday | is_deleted |
  7. +----+-------+------------+------------+
  8. | 21 | yoona | 1990-02-16 | 0 |
  9. | 22 | aa | 1990-01-13 | 0 |
  10. +----+-------+------------+------------+
  11. 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;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='学生表';
复制代码

在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: 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)

到此这篇关于详解MySQL主键唯一键重复插入办理 方法的文章就先容 到这了,更多相干 MySQL主键唯一键重复插入内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的相干 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 123457751 | 2021-9-17 07:46:12 | 显示全部楼层
吹牛的人越来越多了!
回复

使用道具 举报

avatar 默默MYQ | 2021-9-25 18:48:33 | 显示全部楼层
不灌水就活不下去了啊!
回复

使用道具 举报

avatar 一心之恋祭 | 2021-9-26 06:30:09 | 显示全部楼层
世界末日我都挺过去了,看到admin楼主我才知道为什么上帝留我到现在!
回复

使用道具 举报

avatar 刘金栋 | 2021-9-28 06:54:58 | 显示全部楼层
很有品味!
回复

使用道具 举报

avatar 123457814 | 2021-9-28 20:56:59 | 显示全部楼层
看了这么多帖子,第一次看看到这么有内涵的!
回复

使用道具 举报

admin楼主就是我的榜样哦
回复

使用道具 举报

avatar 上善若水8L8 | 2021-10-1 06:42:40 | 显示全部楼层
好无聊啊!
回复

使用道具 举报

avatar 春天到了 | 2021-10-6 01:58:55 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 尹泽汐猩 | 2021-10-15 14:21:58 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,他卖的服务器是永久的,我们的网站用 服务器都是在这家买的,你可以去试试。访问地址:http://fwq.mxswl.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则