mysql实现upsert
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,upsert(update or insert), 即更新或写入。MySQL中实现upsert操作方式:思路:通过判断插入的记录里是否存在主键索引或唯一索引冲突,来决定是插入还是更新。当出现主键索引或
千家信息网最后更新 2025年12月02日mysql实现upsert
- upsert(update or insert), 即更新或写入。
- MySQL中实现upsert操作方式:
思路:通过判断插入的记录里是否存在主键索引或唯一索引冲突,来决定是插入还是更新。当出现主键索引或唯一索引冲突时则进行update操作,否则进行insert操作。
实现:使用 ON DUPLICATE KEY UPDATE
来看看下面具体实现过程。
一、准备数据表
CREATE TABLE `demo` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `a` tinyint(1) unsigned NOT NULL DEFAULT '0', `b` tinyint(1) unsigned NOT NULL DEFAULT '0', `c` tinyint(1) unsigned NOT NULL DEFAULT '0', `d` tinyint(1) unsigned NOT NULL DEFAULT '0', `e` tinyint(1) unsigned NOT NULL DEFAULT '0', `f` tinyint(1) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `unq_a_b_c` (`a`,`b`,`c`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;注意:表中存在两处索引,id为主键索引,a,b,c为联合唯一索引。
二、写入初始数据
insert into test.demo(a,b,c,d,e,f) values(1,1,1,1,1,1);此时存在由abc散列组成唯一索引数据:1,1,1。
三、进一步实现
insert into demo(a,b,c,d,e,f) values(1,1,1,2,2,2) ON DUPLICATE KEY UPDATE a=2,b=2,c=3,d=4,e=5,f=6;因为已经存在由abc三列组成唯一索引数据:1,1,1,本次又写入demo(a,b,c,d,e,f) values(1,1,1,2,2,2),会造成唯一索引冲突。因此,会触发ON DUPLICATE KEY 后面的 UPDATE a=2,b=2,c=3,d=4,e=5,f=6操作。至此,已经实现upsert功能。请记住 ON DUPLICATE KEY UPDATE的用法。
实现mysql的批量更新
insert into statistic_customer(customer_id,current_period,period_number,client_upload_bill,update_time) values (1,201604,100,100,1540470829), (314,201604,100,100,1540470829), (315,201604,100,100,1540470829), (316,201611,100,100,1540470829) ON DUPLICATE KEY UPDATE customer_id=values(customer_id), current_period=values(current_period), period_number=values(period_number), client_upload_bill=values(client_upload_bill), update_time=values(update_time)public static function test() { $updateData = [ [ 'customer_id' => 1, 'current_period' => 201604, 'period_number' => 100, 'client_upload_bill' => 100, 'update_time' => time(), ], [ 'customer_id' => 314, 'current_period' => 201604, 'period_number' => 100, 'client_upload_bill' => 100, 'update_time' => time(), ], [ 'customer_id' => 315, 'current_period' => 201604, 'period_number' => 100, 'client_upload_bill' => 100, 'update_time' => time(), ], ['customer_id' => 316, 'current_period' => 201611, 'period_number' => 100, 'client_upload_bill' => 100, 'update_time' => time(), ], ]; $sql = self::buildSQL('statistic_customer', $updateData); DB::insert($sql); } private static function buildSQL(string $tableName, array $updateData): string { $sql = "insert into {$tableName}("; $keys = array_keys($updateData[0]); $sql .= implode(',', $keys); $sql .= ') values'; $valuesStr = ''; foreach ($updateData as $value) { $valuesStr .= '(' . implode(',', array_values($value)) . '),'; } $sql .= rtrim($valuesStr, ','); $sql .= ' ON DUPLICATE KEY UPDATE '; $updateStr = ''; foreach ($keys as $key) { $updateStr .= "{$key}=values($key),"; } $sql .= rtrim($updateStr, ','); return $sql; }
索引
数据
冲突
更新
功能
思路
数据表
方式
至此
过程
还是
中实
进一
准备
联合
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全从你做起
华为针对网络安全会议的讲话
东南大学研究生院网络安全
深泽县首场网络安全培训开课
js access数据库
日本软件开发论坛
威科国际法律数据库
趣味网络安全知识
泰安市网络安全委员会
车载网络安全架构
vb数据库下载
铭飞cms数据库表
福建个人软件开发供应
沈明航 网络安全
榆林博睿网络技术有限公司
晋城软件开发规定
长沙学软件开发去哪里
惠普无线打印服务器
gb 软件开发过程
重庆代还软件开发资料大全
ycwl610 服务器
java 远程访问数据库
英语博客网络安全
圣玺网络技术
方舟手游删除后服务器存档在哪
云服务器香港bgp和cn2
网络安全方向MacBook
亚马逊海外购服务器
抓取数据库网站
点击安装数据库没有反应