博客
关于我
ON DUPLICATE KEY UPDATE 用法与说明
阅读量:639 次
发布时间:2019-03-14

本文共 1751 字,大约阅读时间需要 5 分钟。

ON DUPLICATE KEY UPDATE作用及使用方法

MySQL的ON DUPLICATE KEY UPDATE是一个强大的工具,可以帮助开发者在插入操作中自定义处理已存在记录的逻辑。这一功能在处理重复插入冲突时特别有用。以下将详细介绍其用法及实际应用场景。


重复插入处理

ON DUPLICATE KEY UPDATE主要用于解决插入操作中重复主键值的问题。假设有一个表 user_admin_t,其主键为 _id,当尝试插入与已有记录重复的主键值时,会触发更新操作。

例如,考虑以下表结构:

CREATE TABLE user_admin_t (    _id VARCHAR(255) PRIMARY KEY,    password VARCHAR(255));

初次插入

第一次插入如下 SQL:

INSERT INTO user_admin_t (_id, password) VALUES ('1', '第一次插入的密码');

执行后,表中将新增一条记录:

_id password
'1' '第一次...'

重复插入

再次运行同样的插入 SQL:

INSERT INTO user_admin_t (_id, password) VALUES ('1', '第一次插入的密码');

这时会出现主键冲突:

[Error] 1062 - Duplicate entry '1' for key 'PRIMARY'

解决方法:触发更新

为避免冲突,可以在插入语句末添加 ON DUPLICATE KEY UPDATE,用于指定在冲突发生时所需执行的更新操作。例如:

INSERT INTO user_admin_t (_id, password) VALUES ('1', '第一次插入的密码') ON DUPLICATE KEY UPDATE    _id = 'UpId',    password = 'upPassword';

该处的变化

  • _id 存在时,会更新 password'upPassword'
  • 主键 _id 保持不变,但 password 得到更新。
  • 受影响的行为:修改已有记录。

执行后的表数据示例如下:

_id password
'1' 'upPassword'

处理多条记录

考虑插入多条记录,包括已经存在的 _id 和新插入的。例如:

INSERT INTO user_admin_t (_id, password) VALUES ('1', '多条插入1'), ('2', '第二条记录') ON DUPLICATE KEY UPDATE    password = '更新后的密码';

执行结果

  • _id'1' 的记录,password 更新为 '多条插入1'
  • _id'2' 的记录新插入至表中。
  • 表中数据:
_id password
'1' '多条插入1'
'2' '第二条记录'

动态更新值

有时需要为不同的 _id 动态设置不同的更新值。在这种情况下,可以利用 VALUES 函数动态传递更新值。例如:

INSERT INTO user_admin_t (_id, password) VALUES ('1', '多条插入1'), ('UpId', '多条插入2') ON DUPLICATE KEY UPDATE    password = VALUES('多条插入1'), VALUES('多条插入2');

该处的解释

  • 对于 _id'1' 的记录,password 更新为 '多条插入1'
  • 对于 _id'UpId' 的记录,password 更新为 '多条插入2'

这种方法特别适用于批量插入或动态更新操作。


总结

ON DUPLICATE KEY UPDATE 是一个强大的工具,能够在插入操作中自动触发更新。其优势在于无需手动检查记录存在状态,可以简化代码结构,提升性能。然而,这一功能是 MySQL 特有的,使用时需确保主键和插入值的对应关系正确,避免因逻辑错误导致意外修改数据。

在实际应用中,可以根据需求灵活配置更新逻辑,例如通过 SET 类似语法或结合事务处理,以实现更复杂的数据管理需求。

转载地址:http://vpooz.baihongyu.com/

你可能感兴趣的文章
OpenCV与AI深度学习 | 实战 | 使用姿态估计算法构建简单的健身训练辅助应用程序
查看>>
OpenCV与AI深度学习 | 实战 | 基于OpenCV和K-Means聚类实现颜色分割(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)
查看>>
OpenCV与AI深度学习 | 实战 | 文本图片去水印--同时保持文本原始色彩(附源码)
查看>>
OpenCV与AI深度学习 | 实战 | 通过微调SegFormer改进车道检测效果(数据集 + 源码)
查看>>
OpenCV与AI深度学习 | 实战—使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战篇——基于YOLOv8和OpenCV实现车速检测(详细步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 实战|OpenCV实时弯道检测(详细步骤+源码)
查看>>
OpenCV与AI深度学习 | 实用技巧 | 使用OpenCV进行模糊检测
查看>>
OpenCV与AI深度学习 | 实践教程|旋转目标检测模型-TensorRT 部署(C++)
查看>>
OpenCV与AI深度学习 | 工业缺陷检测中数据标注需要注意的几个事项
查看>>
OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
查看>>
OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
查看>>
OpenCV与AI深度学习 | 水下检测+扩散模型:或成明年CVPR最大惊喜!
查看>>
OpenCV与AI深度学习 | 深入浅出了解OCR识别票据原理
查看>>
OpenCV与AI深度学习 | 深度学习检测小目标常用方法
查看>>
OpenCV与AI深度学习 | 超越YOLOv10/11、RT-DETRv2/3!中科大D-FINE重新定义边界框回归任务
查看>>
OpenCV与AI深度学习 | 高效开源的OCR工具:Surya-OCR介绍与使用
查看>>