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
语句,就可以完成重复之后的处理,如下
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
中,插入时发生唯一键约束后的简单处理。
当然了,这种处理比较简单,只适合单表。
如果异常有涉及多表的处理的话,那还是老老实实捕获异常吧。
我是半月,你我一同共勉!!!