前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL插入重复后进行覆盖更新

MySQL插入重复后进行覆盖更新

作者头像
半月无霜
发布2023-10-26 16:58:33
4070
发布2023-10-26 16:58:33
举报
文章被收录于专栏:半月无霜半月无霜

MySQL插入重复后进行覆盖更新

一、介绍

MySQL中,常常会有唯一键的约束,当使用Java插入重复的值后,会报异常我们需要进行捕获处理。

上面的解决思路,确实是一种办法,但我将介绍一下MySQL的一种插入写法,可以解决这种插入重复数据的问题。

二、使用

首先,我们先建立一张有唯一键的表,并初始化插入一条数据

代码语言:javascript
复制
CREATE TABLE `tb_user_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(20) NOT NULL COMMENT '姓名',
  `old_name` varchar(20) DEFAULT NULL COMMENT '曾用名',
  `id_card` varchar(20) NOT NULL COMMENT '身份证号码',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `create_user_id` int(11) DEFAULT NULL COMMENT '创建用户',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `update_user_id` int(11) DEFAULT NULL COMMENT '更新用户',
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_idCard` (`id_card`) USING BTREE COMMENT '唯一身份证号码'
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='测试-用户信息表';

INSERT INTO `test`.`tb_user_info`(`id`, `name`, `old_name`, `id_card`, `create_time`, `create_user_id`, `update_time`, `update_user_id`) VALUES (1, '半月无霜', NULL, '50001', '2023-10-25 15:47:31', 1, '2023-10-25 15:54:17', 1);

接下来就将插入一条重复的数据

代码语言:javascript
复制
INSERT INTO `test`.`tb_user_info`(`id`, `name`, `old_name`, `id_card`, `create_time`, `create_user_id`, `update_time`, `update_user_id`) 
VALUES (2, '半月无霜新名字', NULL, '50001', '2023-10-25 15:47:31', 1, '2023-10-25 15:47:31', 1);

会发现出现报错,id_card=50001已经存在,不允许重复插入

那么我们只要在后面加上ON DUPLICATE KEY UPDATE语句,就可以完成重复之后的处理,如下

代码语言:javascript
复制
INSERT INTO `test`.`tb_user_info`(`id`, `name`, `old_name`, `id_card`, `create_time`, `create_user_id`, `update_time`, `update_user_id`) 
VALUES (2, '半月无霜新名字', NULL, '50001', '2023-10-25 15:47:31', 1, '2023-10-25 15:47:31', 1);
ON DUPLICATE KEY UPDATE
old_name = `name`,
`name` = VALUES(`name`),
update_time = now();

ON DUPLICATE KEY UPDATE语句后面跟随着的就是发生重复之后的处理,这边的语句意味着

  • old_name = name,将曾用名设置为名字
  • name = VALUES(name),将名字设置为插入的新名字,VALUES(column)代表插入的数据
  • update_time = now(),将更新时间设置为当前时间

这边额外再提示一个点,如果主键是使用自增序列的,使用触发ON DUPLICATE KEY UPDATE语句后,序列会自动往后移动。

这也就是说,主键会出现断层的现象。

三、最后

以上,就是在MySQL中,插入时发生唯一键约束后的简单处理。

当然了,这种处理比较简单,只适合单表。

如果异常有涉及多表的处理的话,那还是老老实实捕获异常吧。

我是半月,你我一同共勉!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MySQL插入重复后进行覆盖更新
    • 一、介绍
      • 二、使用
        • 三、最后
        相关产品与服务
        云数据库 MySQL
        腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档