新闻中心

如何在mysql中使用INSERT ON DUPLICATE KEY UPDATE

2025-11-12
浏览次数:
返回列表
答案:INSERT ON DUPLICATE KEY UPDATE 用于处理唯一键或主键冲突时执行更新操作。当插入数据存在冲突则更新指定字段,否则插入新记录,适用于存在则更新、不存在则插入的场景,如用户登录统计,需确保表上有唯一索引或主键,利用VALUES()获取插入值,可避免竞争条件并提升效率。

如何在mysql中使用insert on duplicate key update

在 MySQL 中,INSERT ON DUPLICATE KEY UPDATE 是一种非常实用的语句,用于在插入数据时,如果遇到唯一键或主键冲突,就执行更新操作,而不是报错。这个功能特别适合处理“存在则更新,不存在则插入”的场景。

基本语法

该语句的基本结构如下:

INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2), ...;

说明:

  • 当插入的数据导致唯一索引或主键冲突时,MySQL 会执行 UPDATE 部分。
  • 如果没有冲突,则正常插入新记录。
  • VALUES(column) 表示你尝试插入的值,不是当前表中的值。

使用场景示例

假设有一个用户登录统计表:

小爱开放平台 小爱开放平台

小米旗下小爱开放平台

小爱开放平台 291 查看详情 小爱开放平台 CREATE TABLE user_stats ( user_id INT PRIMARY KEY, login_count INT DEFAULT 0, last_login DATETIME );

我们希望每次用户登录时:

  • 如果 user_id 不存在,就插入一条新记录,login_count 为 1。
  • 如果已存在,就将 login_count 加 1,并更新最后登录时间。

可以这样写:

INSERT INTO user_stats (user_id, login_count, last_login) VALUES (1001, 1, NOW()) ON DUPLICATE KEY UPDATE login_count = login_count + 1, last_login = NOW();

第一次执行:插入 user_id=1001 的记录。
第二次执行:发现主键冲突,于是更新 login_count 和 last_login。

注意事项与技巧

  • 必须有唯一索引(UNIQUE)或主键(PRIMARY KEY),否则不会触发“duplicate key”错误,也就不会执行 UPDATE。
  • UPDATE 中可以引用 VALUES() 函数获取插入时的值,比如 VALUES(login_count) 返回的是你试图插入的那个值。
  • 可以只更新部分字段,不需要更新所有列。
  • 如果 UPDATE 后的值和原值一样,MySQL 可能仍会认为发生了“变更”,影响 affected rows 的返回值(通常变为 2)。

实际应用建议

  • 适用于计数器、状态更新、缓存同步等幂等性操作。
  • 比先 SELECT 再 INSERT/UPDATE 更高效,避免了多次查询和潜在的竞争条件。
  • 注意不要滥用,确保业务逻辑确实符合“插入或更新”模式。

基本上就这些。只要表上有唯一约束,就可以安全使用 INSERT ON DUPLICATE KEY UPDATE 来简化逻辑。不复杂但容易忽略细节,比如 VALUES() 的用法。

以上就是如何在mysql中使用INSERT ON DUPLICATE KEY UPDATE的详细内容,更多请关注其它相关文章!


# 全攻略  # 无锡推广网站  # 短时间怎么推广网站  # seo具体做什么分类  # 酉阳seo推广代运营  # 中国教育研究关键词排名  # 网站建设设计的价格  # 临沂网站优化联系企  # 江苏seo网站优化  # 天津快手营销推广企业  # 准营销推广么云速捷选定  # mysql  # 适用于  # 多个  # 则更  # 用户登录  # 不存在  # 小爱  # 镜像  # 主键  # 离线 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: c++20的std::jthread是什么_c++可中断线程与RAII式管理  谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  在J*a中如何隐藏复杂性_使用门面模式组织对象交互  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  内存检查:在VS Code中调试C++时的内存视图  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  Yandex浏览器官方网页版入口 Yandex浏览器最新版官网  iCloud登录入口网页版 苹果iCloud官网登录  百度网盘网页版入口 百度网盘网页版官方登录网址  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  《刺客信条:影》PS5 Pro和Switch 2画面对比  DLsite中文平台入口 DLsite官网内容在线查看  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  海棠电脑版入口_通过电脑访问海棠官网阅读  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  composer的"require-dev"部分是用来做什么的?  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  黑猫投诉统一入口官网 消费者权益保护投诉平台  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  4399免费游戏网址入口 4399小游戏免费入口点开即玩  汽水音乐在线解析 汽水音乐在线解析入口  Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突  Composer如何在生产环境安全地执行composer update  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  机器学习中对数变换预测结果的反向还原  顺丰快件物流信息 官方网站查询入口  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察  《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  J*aScript数组对象转换:按指定键分组与值收集  深入理解J*aScript Promise异步执行与微任务队列  Mac怎么锁定备忘录_Mac备忘录加密设置教程  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  CSS实现侧边栏导航项全宽圆角悬停背景效果  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  抖音网页版平台入口 抖音网页版官网在线访问教程  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南 

搜索