INSERT ... ON DUPLICATE KEY UPDATE

mysql特殊语法insert into .. on duplicate key update ..使用详解 阅读详情

网上关于INSERT … ON DUPLICATE KEY UPDATE大多数文章都是同一篇文章转来转去,首先这个语法的目的是为了解决重复性,当数据库中存在某个记录时,执行这条语句会更新它,而不存在这条记录时,会插入它。

相当于 先判断一条记录是否存在,存在则update,否则insert。其语法是:

INSERT INTO tablename(field1,field2, field3, ...) VALUES(value1, value2, value3, ...) ON DUPLICATE KEY UPDATE field1=value1,field2=value2, field3=value3, ...;
tablename是表名,field1,field2,field3等是字段名称,value1,value2,value3等是字段值。

例如:

INSERT INTO t_stock_chg(f_market, f_stockID, f_name) VALUES('SH', '600000', '白云机场') ON DUPLICATE KEY UPDATE f_market='SH', f_name='浦发银行';

这条语句如果记录不存在,插入该记录;存在将f_market改为SH,f_name改为浦发银行。现在有个问题是:这条语句判断该条记录是否存在的标准是什么?由于同一个值是可以同时出现在多个记录中的,所以必须有个字段是唯一不能重复的。

规则是这样的:如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。所以 ON DUPLICATE KEY UPDATE是不能写where条件的,例如如下语法是错误的:

INSERT INTO t_stock_chg(f_market, f_stockID, f_name) VALUES('SH', '600000', '白云机场') ON DUPLICATE KEY UPDATE f_market='SH', f_name='浦发银行' WHERE f_stockID='600000';

因为由UNIQUE索引或者主键保证唯一性,不需要WHERE子条件。所以上面的INSERT INTO t_stock_chg(f_market, f_stockID, f_name) VALUES(‘SH’, ‘600000’, ‘白云机场’) ON DUPLICATE KEY UPDATE f_market=‘SH’, f_name=‘浦发银行’;中f_stockID就是唯一主键。

这里特别需要注意的是:如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2,如果更新的数据和已有的数据一模一样,则受影响的行数是0,这意味着不会去更新,也就是说即使你有的时间戳是自动记录最后一次的更新时间,这个时间戳也不会变动。例如:

CREATE TABLE `t_stock_chg` (
`f_market` varchar(64) NOT NULL COMMENT '市场',
`f_stockID` varchar(10) NOT NULL DEFAULT '' COMMENT '股票代码',
`f_updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '插入时间戳',
`f_name` varchar(16) DEFAULT NULL COMMENT '股票名称',
PRIMARY KEY (`f_market`,`f_stockID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

这里的字段f_updatetime每次在更新数据时会自动更新,但是如果记录中存在某条数据,后来又更新它,而更新的数据和原数据一模一样,那么这个字段也不会更新,仍然是上一次的时间。此时INSERT … ON DUPLICATE KEY UPDATE影响行数是0。

在对一对多属性修改时我们可能会常常用到该功能,不用 专门业务代码去判断是新增还是修改;

-- 一个活动可能对应多个商品的多个SKU,可能一个商品有多个SKU但是只要其中几个SKU参加活动
create table jiuyoulife_uat.j_shop_activity_goods
(
   group_id             national int(11) not null comment '团购活动ID',
   product_id           national char(32) not null comment '产品ID',
   goods_id             national char(32) not null comment 'goods_id',
   activity_type        int(2) not null default NULL comment '活动类型:0团购',
   stock                int(11) comment '库存',
   super_price          double comment '活动价格',
   sales                int(11) comment '销售数量',
   settle_type          int(2) default 0 comment '结算方式:0按比例结算1按底价结算',
   ratio                double comment '底价:浮点数;结算比例(1-100)%',
   create_time          datetime default CURRENT_TIMESTAMP,
   update_time          datetime,
   primary key (group_id, goods_id)
);


-- 插入更新:如果三个主键相同则更新,否则进行插入操作
insert into j_shop_activity_goods ( group_id, product_id, goods_id, activity_type, stock, super_price, sales, settle_type, ratio, create_time, update_time) values 
( 1, 1, 1, 0, 100,0.01, 0, 0, 10,NOW(),NOW() ) , 
( 1, 1, 1, 0, 100,0.01, 0, 0, 10,NOW(),NOW() ) 
 ON DUPLICATE KEY UPDATE 
 activity_type = VALUES(activity_type), 
 stock = VALUES(stock), 
 super_price = VALUES(super_price), 
 settle_type = VALUES(settle_type),
  ratio = VALUES(ratio), 
  update_time = VALUES(update_time) 

参考文

前半部分原文出自:
沫小淘https://www.cnblogs.com/moxiaotao/p/9431808.html

SQL中的魔法操作:INSERT ON DUPLICATE KEY UPDATE深度解析 是一个非常有用的 SQL 操作,能够在插入数据时处理重复数据,并进行更新。这在许多高并发、需要同时执行插入和更新操作的场景中非常有效。优势说明简化代码避免了手动检查数据是否存在的繁琐过程高效的数据处理在高并发环境下处理重复数据时,减少了查询和插入的开销批量处理支持批量插入与更新,适合处理大量数据。 阅读详情

相关推荐

时序基础模型Timer-S1:十亿参数如何革新时间序列预测

时间序列预测是数据分析与机器学习中的核心任务,旨在基于历史数据预测未来趋势。其原理在于捕捉数据中的趋势、周期性和季节性等时序依赖关系。这项技术的价值在于赋能业务决策,广泛应用于金融风控、能源管理、物联网监控和供应链优化等关键场景。传统方法依赖针对特定任务的专用模型,面临泛化能力弱和开发成本高的挑战。本文聚焦的时序基础模型,通过在海量跨领域数据上进行预训练,学习时序通用模式,并结合十亿级参数带来的强大容量,实现了性能的显著突破。这种范式转变,使得模型能够像“全科医生”一样,通过少量数据微调即可快速适应新任务,

weixin_29164843的博客 268

insert...on duplicate key update语法详解

一.作用和使用场景 在mysql入库时,不能出现两条数据主键一致的情况,因为在两条数据的主键一致的情况下,mysql就会判定为待插入数据在数据库中存在重复数据,也就是说判断数据是否重复是根据主键来区别的。 但是有一些场景,如日志文件解析入库,消息队列接收数据入库等情况下可能解析到或者接收到待插入的重复数据存在重复数据则更新,不存在则插入。 这时如下语句的写法就派上用场了,on dupli...

赵英超的博客 4万+

MATLAB闪退别慌!5分钟搞定Windows系统预设文件修复(附详细截图)

本文针对MATLAB在Windows系统下频繁闪退的问题,提供了快速有效的解决方案。核心在于修复或重置损坏的MATLAB预设文件,通过图文并茂的五步法,指导用户定位AppData目录、重命名预设文件夹,从而让MATLAB自动生成全新配置以解决闪退。文章还涵盖了问题诊断、设置备份及进阶排查方法,帮助用户彻底根除启动故障。

weixin_29234423的博客 925

INSERT ON DUPLICATE KEY UPDATE

在执行Replace后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了Delete删除这条记录,然后再记录用Insert来插入这条记录。使用Replace插入一条记录时,如果不重复,Replace就和Insert的功能一样,如果有重复记录,Replace就使用新记录的值来替换原来的记录值。场景大概是这样的,业务方的需求是查询一条语句在不在,如果在就给出一个update语句,更新这条记录,如果不在,就给出一个insert语句,插入这条记录。

qq_43632987的博客 2682

多智能体强化学习论文——SEAC(NIPS 2020)

存在的问题&研究动机&研究思路 在稀疏奖励的环境下,多智能体的exploration存在效率不足等问题。 在IAC的基础上尝试加入重要性采样,使得每次更新智能体iii的参数时,不再仅仅使用智能体iii的数据,而是使用所有智能体的数据进行智能体iii数据的更新。 对于原始的IAC算法是on-policy的,而SEAC则是off-poligy的。 创新点 在每个智能体iii的actoriactor_iactori​和criticicritic_icritici​的更新过程中,都加入了重要性

我的AI笔记 1206

AI中台系统设计方案探讨

集成JupyterLab、低代码建模工具(如H2O.ai)、预训练模型库(Hugging Face、PaddleHub)。:通过REST/gRPC接口封装AI能力(如OCR、语音识别),支持流量控制与鉴权(如Kong、Apigee)。:服务注册发现(Consul)、熔断降级(Hystrix)、监控告警(Prometheus+Grafana)。:分布式存储(如HDFS、Ceph)与对象存储(如S3、OSS),支持海量数据高速读写。加密传输(TLS)、动态脱敏(如数据掩码)、访问控制(RBAC)。

reset2021的博客 1031

INSERT ... ON DUPLICATE KEY UPDATE ... 批量插入与更新(存在则更新,不存在则插入)

一、前言 作为后台开发,相信大家在做业务开发时,经常会遇到这样的场景。那就是数据库没有该数据的话就做插入操作,有的话就做更新操作。 方法1:遍历集合,判断里面的对象是否存在 存在则单个update,不存在则单个insert。这样的逻辑看着貌似没问题,其实问题大着呢。要是数据量多的话,你哟一个个判断,一个个执行update或者insert操作,这样频繁操作数据库的话,性能影响超级大,直接会超时。所以...

riemann_的博客 6441

HALCON基于描述符的模板匹配(未标定)

HALCON基于不标定描述符的模板匹配

king_linj的博客 890

INSERT ON DUPLICATE KEY UPDATE返回值引起的小乌龙

thanks for reading.有其它方案或想法可以一起交流!

mxt51220的博客 1544

一个 ABAP 工具,能打印系统里某个用户对 BSP 应用的浏览历史记录

只要一个用户在 SAP ABAP 系统里浏览过 BSP 页面,会留下浏览历史记录。本工具会解析出这些记录,打印出该用户浏览的历史事件,和浏览过的页面名称。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 545

robosuite 入门教程(一)安装与基本用法

摘要:Robosuite是基于MuJoCo的模块化机器人仿真框架,提供标准化基准测试环境和多样化机器人控制功能。作为ARISE计划的一部分,该框架支持强化学习、模仿学习等算法研究,包含程序化环境生成、多模态传感器、多种控制器及遥操作设备。支持macOS/Linux系统,提供详细安装指南和功能演示脚本,包括随机动作测试、控制器验证、域随机化等。最新版本v1.5新增人形机器人支持、全身控制器和照片级渲染功能,旨在降低机器人学习研究门槛,促进算法开发与评估。

2506_90492529的博客 1266

mysql INSERT ... ON DUPLICATE KEY UPDATE语句

网上关于ON DUPLICATE KEY UPDATE大多数文章都是同一篇文章转来转去,首先这个语法的目的是为了解决重复性,当数据库中存在某个记录时,执行这条语句会更新它,而不存在这条记录时,会插入它。 相当于 先判断一条记录是否存在,存在则update,否则insert。其语法是: INSERT INTO tablename(field1,field2, field3, ...) VAL

左雪菲的专栏 3万+

光学系统仿真软件:OSLO_(13).衍射光学元件设计v1

目标函数是设计DOE的关键步骤之一。目标函数可以是一个具体的光强分布,也可以是一个特定的波前形状。在仿真软件中,目标函数通常用数学表达式或数据文件来定义。假设我们需要设计一个二元相位掩模,使其在特定位置生成三个焦点。我们可以定义一个目标函数来描述这三个焦点的光强分布。# 定义目标函数"""定义一个多焦点目标函数:param x: 横坐标:param y: 纵坐标:param z1: 第一个焦点的深度:param z2: 第二个焦点的深度:param z3: 第三个焦点的深度。

kkchenjj的博客 1001

MySQL INSERT ON DUPLICATE KEY UPDATE

MySQL INSERT ON DUPLICATE KEY UPDATE

qq_32740259的博客 2661

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

INSERT ... ON DUPLICATE KEY UPDATE产生death lock死锁原理

我们在实际业务场景中,经常会有一个这样的需求,插入某条记录,如果已经存在了则更新它如果更新日期或者某些列上的累加操作等,我们肯定会想到使用INSERT ... ON DUPLICATE KEY UPDATE语句,一条语句就搞定了查询是否存在和插入或者更新这几个步骤,但是使用这条语句在msyql的innodb5.0以上版本有很多的陷阱,即有可能导致death lock死锁也有可能导致主从模式下的replication产生数据不一致。

码农的世界你不懂 5万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

GaussDB insert on duplicate key update的用法

对于带有唯一约束(UNIQUE INDEX或PRIMARYKEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新,对于不带唯一约束的表,则仅执行插入。UPDATE时,若指定NOTHING则忽略此条插入,可通过"EXCLUDED." 或者 "VALUES()" 来选择源数据相应的列。

weixin_41176230的博客 1182

INSERT INTO ON DUPLICATE KEY UPDATE 与 REPLACE INTO 和 INSERT IGNORE INTO

1、REPLACE INTO发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。 2、INSERT INTO ON DUPLICATE KEY UPDATE发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。 3、INSERT IGNORE INTO 发现存在则忽略本条,不再插入数据。 INSER

猴子的故事 1330

Mysql中Insert into xxx on duplicate key update问题

要点:Insert into xxx on duplicate key update可以在唯一索引重复的情况下,进行更新操作。           (1) 插入里边的字段应该只有一个 唯一索引;            (2)多行插入用values(value)  在看代码的过程中碰到了这一用法,不太理解,google了一下。它的意义其实是如果在insert语句末尾制定了on dupl

crazyhacking的专栏 2802

并发插入语法 INSERT ... ON DUPLICATE KEY UPDATE

1.前言 在日常开发中会遇到这样一个场景,新增或变更创建一条记录 如果数据库已经存在同一主键的记录,则执行更新操作 ; 如果不存在,则执行新增操作 ; 实现思路 1 > 业务层处理业务层代码处理,但需要先查询,查询和插入并不是原子性操作,在并发量比较高的时候,可能会出现两个线程都查询某记录不存在,就会执行两次插入。解决并发就得加锁,但加锁势必会影响性能。 实现思路2 > 数据库层 ...

程序员小强的博客 8904

INSERT … ON DUPLICATE KEY UPDATE 小析

MySQL 自4.1版以后开始支持INSERT … ON DUPLICATE KEY UPDATE语法,使得原本需要执行3条SQL语句(SELECT,INSERT,UPDATE),缩减为1条语句即可完成。 例如ipstats表结构如下: CREATE TABLE ipstats ( ip VARCHAR(15) NOT NULL UNIQUE,

Kris0x007的专栏 879

MySQL 之 INSERT INTO… ON DUPLICATE KEY UPDATE

在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新。 在刚碰到的时候,第一反应是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有 INSERT INTO… ON DUPLICATE KEY UPDATE 一步就可以完成,感觉实在是太方便了。

sign_77777123的博客 917

MySQL中 insert into ... on duplicate key update ... values() 的使用笔记

**说明: 1. on duplicate key update 含义: 1)如果在INSERT语句末尾指定了 on duplicate key update, 并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值, 则在出现重复值的行执行UPDATE; 2)如果不会导致唯一值列重复的问题,则插入新行。 2. values(col_nam...

碣石观海的博客 2万+

Insert into on duplicate key update 死锁问题解析

Insert into on duplicate key update 死锁问题解析

Y_eatMeat的博客 2266

MySQL INSERT ... ON DUPLICATE KEY UPDATE

备注:测试数据库版本为MySQL 8.0 真实环境中会有一种应用场景,如存在更新,不存在则更新,Oracle中有merge语句,可以实现此功能。 MySQL中可以用INSERT … ON DUPLICATE KEY UPDATE来实现。 文章目录一.从一个简单的例子看INSERT ... ON DUPLICATE KEY UPDATE二.模拟一个同事存在insert+update的例子 一.从一个简单的例子看INSERT … ON DUPLICATE KEY UPDATE 代码: create table

只是甲的博客 8691
上一篇: logback-spring.xml配置文件
下一篇: flink入门实例-Windows下本地模式跑SocketWordCount
牧竹子
博客等级 码龄17年 572粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值