ON DUPLICATE KEY UPDATE

本文介绍了MySQL数据库中,insert语句后使用ON DUPLICATE KEY UPDATE子句的情况。若插入行与表中现有记录的唯一索引或主键重复,会更新旧行;若不重复,则插入新记录。还通过具体示例展示了该子句的执行结果。

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

  在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值,那么就会发生旧行的更新;如果插入的行数据与现有表中记录的唯一索引或者主键不重复,则执行新纪录插入操作。

        比如有这样一张表:

create table daily_hit_counter (

day date not null,

slot tinyint unsigned not null,

cnt int unsigned not null,

primary key(day, slot)

) engine = InnoDB;

daily_hit_counter 表的惟一索引是由 day+slot 两个字段组成。

现有数据:

day    slot    cnt
2017-11-19    1    10
2017-11-20    2    10

1. 执行:

insert into daily_hit_counter (day, slot, cnt) values ('2017-11-19', 1, 1) ON DUPLICATE KEY UPDATE cnt = cnt + 1;

由于插入的数据中 day+slot 与现有的记录的唯一索引重复了,所以执行旧行的更新,执行之后,最终结果是这样的:

day    slot    cnt
2017-11-19    1    11
2017-11-20    2    10

2. 执行:

insert into daily_hit_counter (day, slot, cnt) values ('2017-11-19', 2, 1) ON DUPLICATE KEY UPDATE cnt = cnt + 1;

由于插入的数据中 day+slot 与现有的记录的唯一索引或者主键都没有重复了,所以执行新纪录插入,执行之后,最终结果是这样的:

day    slot    cnt
2017-11-19    1    11
2017-11-19    2    1
2017-11-20    2    10
--------------------- 
作者:plg17 
来源:优快云 
原文:https://blog.youkuaiyun.com/plg17/article/details/78583692 
版权声明:本文为博主原创文章,转载请附上博文链接!

### SQL `ON DUPLICATE KEY UPDATE` 语法及用法 当向数据库表中插入数据时,可能会遇到唯一键或主键冲突的情况。为了处理这种情况并更新已存在的记录而非抛出错误,可以使用 `ON DUPLICATE KEY UPDATE` 子句。 #### 基本语法结构 基本的 `INSERT INTO...ON DUPLICATE KEY UPDATE` 的语法规则如下: ```sql INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2); ``` 此命令尝试将新行插入到指定表格中;如果有任何唯一索引列或主键发生冲突,则会触发更新操作而不是插入新的记录[^1]。 对于具体的例子来说,在MySQL环境中,假设有一个名为 `users` 的表,其中包含两个字段:`id` 和 `username` ,并且 `id` 是唯一的。下面是一个如何利用该特性来避免重复条目同时修改现有信息的例子: ```sql INSERT INTO users (id, username) VALUES (1, '张三') ON DUPLICATE KEY UPDATE username = VALUES(username); ``` 这段代码表示如果 `id=1` 已经存在于 `users` 表内,则应将其对应的用户名更改为 `'张三'` 而不是创建另一个具有相同ID的新用户记录[^2]。 值得注意的是,在 MySQL 8.0 版本以前,要达到同样的效果往往依赖于这条指令。而在较新的版本里,虽然功能保持不变,但是内部机制可能有所改进以提高性能和可靠性[^3]。 另外一个重要细节是未被提及但在实际应用中有意义的一点——即那些既不在 `INSERT` 部分也不在 `UPDATE` 部分显式提到的其他非空缺省值将会丢失其原始内容而变为 NULL 。这就好像是先删除旧纪录然后再重新加入一样[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值