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

2023-10-26 16:58:33 浏览数 (1)

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中,插入时发生唯一键约束后的简单处理。

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

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

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

0 人点赞