MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入

文章目录

有时候由于业务需求,可能需要先去根据某一字段值查询数据库中是否有记录,有则更新,没有则插入。这个时候就可以用到ON DUPLICATE KEY UPDATE这个sql语句了。

以下内容基于本地windows环境mysql:8.0.34进行讲解。

一、ON DUPLICATE KEY UPDATE的介绍

基本用法:ON DUPLICATE KEY UPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突(即已存在相同的唯一键值),则会执行更新操作,而不是抛出异常或忽略该条数据。这个语法可以大大简化我们的代码,减少不必要的判断和查询操作。

用法总结
1:on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。
2:记录已存在时,只会更新on duplicate key update之后指定的字段。
3:如果同时传递了主键和唯一键,以主键为判断存在依据,唯一键字段内容可以被修改。
4:唯一键大小写敏感时,大小写不同的值被认为是两个值,执行插入。参见下文中的大小写敏感问题

二、ON DUPLICATE KEY UPDATE的使用

准备表结构及测试数据, 注意:name是唯一键

drop table if exists tbl_test;
create table tbl_test(
	id int primary key auto_increment,
	name varchar(30) unique not null,
	age int comment '年龄',
	address varchar(50) comment '住址',
	update_time datetime default null
) comment '测试表';

insert into tbl_test(name,age,address,update_time) values('zhangsan',20,'杭州',now()),('lisi',21,'武汉',now());
### 解决方案 在 MySQL 中,`ON DUPLICATE KEY UPDATE` 是一种用于处理重复键冲突的机制。当插入数据时遇到唯一索引或主键冲突时,MySQL 会执行指定的更新操作。然而,默认情况下,如果字段被设置为 `NULL` 或者未显式定义更新逻辑,则该字段可能会按照预期行为更新。 为了确保字段因 `NULL` 值而跳过更新,可以采用以下方法: #### 方法一:使用条件表达式 通过在 `ON DUPLICATE KEY UPDATE` 子句中引入条件判断来避免 `NULL` 被写入数据库。例如,可以通过 `IF()` 函数实现[^1]: ```sql INSERT INTO tbl_example (id, value) VALUES (1, NULL) ON DUPLICATE KEY UPDATE value = IF(VALUES(value) IS NOT NULL, VALUES(value), value); ``` 在此示例中,只有当新值 (`VALUES(value)`) 为 `NULL` 时才会更新目标列;否则保留原值。 #### 方法二:利用 COALESCE() 函数替代 IF() 另一种更简洁的方式是应用 SQL 的内置函数 `COALESCE()` 来完成相同功能: ```sql INSERT INTO tbl_example (id, value) VALUES (1, NULL) ON DUPLICATE KEY UPDATE value = COALESCE(VALUES(value), value); ``` 这里 `COALESCE()` 返回第一个非空参数作为最终结果[^2]。 #### 方法三:预设默认值于应用程序层面上 考虑到某些场景下无法直接修改SQL语句本身,在这种情形之下可以在程序端预先设定好合理的缺省数值再提交给数据库服务器进行存储操作前的数据准备阶段就做好相应的处理工作从而规避掉因为传入null而导致的问题发生几率大大降低同时也能提高整体系统的健壮性和可维护程度. --- ### 注意事项 - 如果表结构允许某列为 `NULL` 并且业务逻辑确实需要支持这种情况下的覆盖更新,请务必确认所使用的解决方案能够满足具体需求。 - 对性能敏感的应用应测试同实现方式的影响以便选取最优策略[^3]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值