博客
关于我
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/

你可能感兴趣的文章
phpEnv的PHP集成环境
查看>>
PHPExcel一些基本设置总结
查看>>
phpexcel中文手册
查看>>
PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/c...
查看>>
phpize及其用法
查看>>
phpMailer发送邮件
查看>>
PHPMailer发送邮件
查看>>
phpmailer发送邮件,可以带附件
查看>>
phpmailer的用法
查看>>
phpmyadmin 安装
查看>>
phpmyadmin导出数据库出现Fatal error: Cannot 'break' 2 levels in D:\phpstudy\WWW\phpMyAdmin
查看>>
phpmyadmin数据库建表及插入
查看>>
phpnow配置
查看>>
phprpc简单使用
查看>>
phpspider中当爬虫获取数据时如何去掉广告
查看>>
phpstorm 2016.3.3 激活
查看>>
phpstorm中Xdebug的使用
查看>>
phpstorm中使用svn版本控制器
查看>>
phpstorm配置php脚本执行
查看>>
PhpStorm配置远程xdebug
查看>>