【MySQL】语法 insert into ... on duplicate key update

本文介绍了MySQL的`insert into ... on duplicate key update`语法,当尝试插入的记录根据自增主键或唯一索引键已存在时,会更新该记录,否则插入新记录。受影响行数可以指示是插入还是更新操作。在特定条件下,即使记录数据不变,受影响行数也会有所不同。示例展示了如何使用该语法,并提到了在MySQL 5.5.53和Innodb存储引擎中的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在向 MySQL 中插入一条记录的时候,如果基于自增主键或唯一索引键来判断该记录存在的话,则更新该记录;如果不存在,则插入该记录。这就是语法 insert into … on duplicate key update 的功能。其中,基于主键还是唯一索引键的判断依据是根据表达式中的字段名称来确定的。具体见以下示例:

With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row, 2 if an existing row is updated, and 0 if an existing row is set to its current values. If you specify the CLIENT_FOUND_ROWS flag to the mysql_real_connect() C API function when connecting to mysqld, the affected-rows value is 1 (not 0) if an existing row is set to its current values.

对于每一行记录来说,如果执行结果是新增了,受影响行数为 1;如果对应记录被更新了,受影响行数为 2;如果当前记录和要更新为的记录数据一致,受影响行数为 0 。如果在连接 mysql 服务时 CLIENT_FOUND_ROWS 参数是 mysql_real_connect(),上文最后一种情况的受影响行数为 1 而不是 0 。

本示例所用 MySQL 版本为 5.5.53,存储引擎为 Innodb
参考 MySQL 官网资料地址:https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

表结构

create table t (
	id int unsigned not null auto_increment,
	a_id int unsigned not null,
	b_id int unsigned not null,
	v int unsigned not null,
	primary key (id),
	unique index `uk_a_b` (a_id, b_id)
) engine = innodb default charset = utf8;

第一次插入数据(插入了一条新记录)
插入数据
基于唯一索引插入同样的数据(更新了数据且自增值 +1)
基于唯一索引插入同样的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值