on duplicate key update简单使用

本文介绍了一种在MySQL中高效处理数据更新的方法——使用ON DUPLICATE KEY UPDATE语句。这种方法可以避免在插入数据前进行额外的查询操作,简化代码并提高效率。

1。最近在做项目的时候,遇到这样的一个问题,就是我每做完一件事情,都要更新一下统计表,然而要更新统计表,就要根据主键去统计表里面去查询是否已经有这样的一条记录,如果有那么就更新,如果没有那么就插入一条记录,开始我就是这么干的,结果被老大给否决了,他说可以用on duplicate key update去做。下面就实际操作一下吧:

表结构:

+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| player_id | int(11) | NO | PRI | NULL | |
| count | int(11) | YES | | NULL | |
+-----------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)

老做法是写三条sql语句:

select * from player_count where player_id = 1;//查询统计表中是否有记录

insert into player_count(player_id,count) value(1,1);//没有记录就执行insert 操作

update player_count set count = count+1 where player_id = 1;//有记录就执行update操作

这种写法比较麻烦

用on duplicate key update 的做法如下:

insert into player_count(player_id,count) value(1,1) on duplicate key update count=count+1;

这样每次不管插入还是更新都调用这句语句就能达到我们要的效果,省了不少的判断。

转自:http://blog.sina.com.cn/s/blog_495697e60100lapz.html

注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法!

MySQL 中,使用 `ON DUPLICATE KEY UPDATE` 可以实现在插入数据时,如果遇到主键或唯一索引冲突,则自动执行更新操作。当需要更新多个字段时,可以在 `UPDATE` 子句中列出多个字段的赋值语句,每个字段之间使用逗号分隔。 ### 基本语法 ```sql INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...) ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2, column3 = value3, ...; ``` ### 示例:更新多个字段 假设有一个名为 `users` 的表,定义如下: ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE, email VARCHAR(100), age INT ); ``` 当插入一条记录时,如果 `username` 已经存在,则更新 `email` 和 `age` 字段: ```sql INSERT INTO users (username, email, age) VALUES ('john_doe', 'john@example.com', 30) ON DUPLICATE KEY UPDATE email = 'john@example.com', age = 30; ``` 如果 `username = 'john_doe'` 的记录已经存在,则该语句会更新该记录的 `email` 和 `age` 字段;如果不存在,则插入新记录。 ### 使用 `VALUES()` 函数 在批量插入时,可以使用 `VALUES(column)` 函数来引用插入时的值,从而简化更新语句: ```sql INSERT INTO users (username, email, age) VALUES ('john_doe', 'john@example.com', 30), ('jane_doe', 'jane@example.com', 25) ON DUPLICATE KEY UPDATE email = VALUES(email), age = VALUES(age); ``` 在这个例子中,如果 `username` 冲突,`ON DUPLICATE KEY UPDATE` 子句会使用当前插入的值来更新对应的 `email` 和 `age` 字段[^1]。 ### 注意事项 - `ON DUPLICATE KEY UPDATE` 需要表中存在主键或唯一索引,否则不会触发更新操作[^2]。 - 如果更新的字段包含主键或唯一索引列,并且更新后的值与其他记录冲突,会导致插入和更新都失败。 - 使用 `ON DUPLICATE KEY UPDATE` 时,自增字段(`AUTO_INCREMENT`)可能会跳过某些值,因为每次插入操作都会尝试分配一个新的自增值,即使最终执行的是更新操作[^3]。 ### 总结 通过 `ON DUPLICATE KEY UPDATE`,可以非常方便地实现“存在则更新,不存在则插入”的逻辑。在更新多个字段时,只需在 `UPDATE` 子句中列出多个字段的赋值即可,并且可以结合 `VALUES()` 函数进行动态赋值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值