使用INSERT INTO ... ON DUPLICATE KEY UPDATE批量插入更新导入excel数据的实践场景应用

news/2024/10/18 5:53:10/

INSERT INTO ... ON DUPLICATE KEY UPDATE 是 MySQL 中的一个非常有用的语法,它允许你在插入新记录时,如果记录的唯一键(如主键或唯一索引)已存在,则执行更新操作而不是插入。这可以帮助你避免在插入数据时产生的重复键错误,并允许你以一种原子性的方式处理插入或更新的逻辑。

语法用途

  • 插入新记录:当你要插入的新记录的唯一键在表中不存在时,这条记录会被正常插入。
  • 更新现有记录:如果新记录的唯一键已存在于表中,那么会执行 UPDATE 部分的语句来更新该记录。

语法讲解

基本语法结构如下:

INSERT INTO table_name (column1, column2, ... columnN)
VALUES (value1, value2, ... valueN)
ON DUPLICATE KEY UPDATE
column1 = VALUES(column1), column2 = VALUES(column2), ...
  • table_name:要插入或更新的表名。
  • (column1, column2, ... columnN):要插入或更新的列名。
  • (value1, value2, ... valueN):对应列的值。
  • ON DUPLICATE KEY UPDATE:当遇到重复键时执行的更新操作。
  • column1 = VALUES(column1), column2 = VALUES(column2), ...:要更新的列及其对应的值,VALUES(columnN) 表示的是 INSERT 语句中对应列的值。

示例

假设有一个名为 users 的表,包含 id(主键,自增)、email(唯一索引)和 name 列。

如果你想插入一个新用户,但如果该用户的 email 已存在,则更新其 name,你可以这样做:

INSERT INTO users (email, name)
VALUES ('john@example.com', 'John Doe')
ON DUPLICATE KEY UPDATE
name = VALUES(name);
  • 如果 john@example.comemail 尚未存在于 users 表中,那么会插入一条新记录。
  • 如果 john@example.comemail 已存在于 users 表中,那么会更新该用户的 name 为 ‘John Doe’。

注意事项

  • 确保你的表有定义好的主键或唯一索引,这样 MySQL 才能判断何时执行插入操作,何时执行更新操作。
  • VALUES(columnN) 函数在 ON DUPLICATE KEY UPDATE 子句中用于引用 INSERT 语句中的对应列值。
  • 如果有多个唯一键或唯一索引可能导致冲突,MySQL 会根据定义的顺序来决定使用哪一个。
  • ON DUPLICATE KEY UPDATE 语句可以引用表中的其他列来进行更新,不一定非要用 VALUES(columnN)

这个语法在处理需要确保唯一性的数据时非常有用,比如用户信息、订单号等,它可以减少应用逻辑中的条件判断和数据库操作的次数,提高性能和一致性。

场景应用

从Excel中批量导入数据,使用

 $sql = 'INSERT INTO ' . $db->table('school') . ' (school_id,school_name,school_short_name,school_type,school_attribute,school_teacher,school_student,school_address,school_lng,school_lat,school_leader,school_leader_phone,school_leader2,school_phone2,school_leader3,school_phone3,school_water,school_electricity,school_url,school_content) VALUES ';for ($j = 2; $j <= $highestRow; $j++) {$school_id = $objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue();$school_name = $objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue();$school_short_name = $objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue();$school_type = $objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue();$school_attribute = $objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue();$school_teacher = $objPHPExcel->getActiveSheet()->getCell("F" . $j)->getValue();$school_student = $objPHPExcel->getActiveSheet()->getCell("G" . $j)->getValue();$school_address = $objPHPExcel->getActiveSheet()->getCell("H" . $j)->getValue();$school_lng = $objPHPExcel->getActiveSheet()->getCell("I" . $j)->getValue();$school_lat = $objPHPExcel->getActiveSheet()->getCell("J" . $j)->getValue();$school_leader = $objPHPExcel->getActiveSheet()->getCell("K" . $j)->getValue();$school_leader_phone = $objPHPExcel->getActiveSheet()->getCell("L" . $j)->getValue();$school_leader2 = $objPHPExcel->getActiveSheet()->getCell("M" . $j)->getValue();$school_phone2 = $objPHPExcel->getActiveSheet()->getCell("N" . $j)->getValue();$school_leader3 = $objPHPExcel->getActiveSheet()->getCell("O" . $j)->getValue();$school_phone3 = $objPHPExcel->getActiveSheet()->getCell("P" . $j)->getValue();$school_water = $objPHPExcel->getActiveSheet()->getCell("Q" . $j)->getValue();$school_electricity = $objPHPExcel->getActiveSheet()->getCell("R" . $j)->getValue();$school_url = $objPHPExcel->getActiveSheet()->getCell("S" . $j)->getValue();$school_content = $objPHPExcel->getActiveSheet()->getCell("T" . $j)->getValue();//数据入库;$itemStr = '("';$itemStr .= $school_id . '","' . $school_name . '","' . $school_short_name . '","' . $school_type . '","' . $school_attribute . '","' . $school_teacher . '","' . $school_student . '","' . $school_address . '","' . $school_lng . '","' . $school_lat . '","' . $school_leader . '","'. $school_leader_phone . '","' . $school_leader2 . '","' . $school_phone2 . '","' . $school_leader3 . '","' . $school_phone3 . '","' . $school_water . '","' . $school_electricity . '","' . $school_url . '","' . $school_content;$itemStr .= '"),';$sql .= $itemStr;}$sql = rtrim($sql, ',') . " ON DUPLICATE KEY UPDATE ";$sql .= " school_name= VALUES(school_name), school_short_name = VALUES(school_short_name),school_type = VALUES(school_type),school_attribute = VALUES(school_attribute),school_teacher = VALUES(school_teacher),school_student= VALUES(school_student), school_address = VALUES(school_address),school_lng = VALUES(school_lng),school_lat = VALUES(school_lat),school_leader = VALUES(school_leader),school_leader_phone= VALUES(school_leader_phone), school_leader2= VALUES(school_leader2), school_phone2= VALUES(school_phone2), school_leader3= VALUES(school_leader3),school_phone3= VALUES(school_phone3),school_water= VALUES(school_water), school_electricity= VALUES(school_electricity), school_url= VALUES(school_url), school_url= VALUES(school_content)";$db->query($sql);

@漏刻有时


http://www.ppmy.cn/news/1401950.html

相关文章

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵 目录 前言 一、Givens旋转简介 二、Givens旋转解释 三、Givens旋转进行QR分解 四、Givens旋转进行QR分解数值计算例子 五、求逆矩阵 六、MATLAB仿真 七、参考资料 总结 前言 在进行QR分解时&#xff0c;HouseHolder变换…

软考 - 系统架构设计师 - 架构风格

软件架构风格是指描述特定软件系统组织方式的惯用模式。组织方式描述了系统的组成构件&#xff0c;以及这些构件的组织方式&#xff0c;惯用模式指众多系统所共有的结构和语义。 目录 架构风格 数据流风格 批处理架构风格 管道 - 过滤器架构风格 调用 / 返回风格 主程序…

『Apisix进阶篇』动态负载均衡:APISIX的实战演练与策略应用

&#x1f680;『Apisix系列文章』探索新一代微服务体系下的API管理新范式与最佳实践 【点击此跳转】 &#x1f4e3;读完这篇文章里你能收获到 &#x1f3af; 掌握APISIX中多种负载均衡策略的原理及其适用场景。&#x1f4c8; 学习如何通过APISIX的Admin API和Dashboard进行负…

boost::asio 启用 io_uring(Linux 5.10)队列支持

欲启用 boost::asio 对于 io_uring 的支持&#xff0c;这需要以下几个先决条件&#xff1b; 1、boost 1.78 及以上发行版本 Revision History - 1.78.0 (boost.org) 2、Linux kernel 5.10 及以上发行版本 3、在预定义头文件&#xff08;stdafx.h&#xff09;、或编译器预定义…

[报错解决]Type com.baomidou.mybatisplus.extension.ddl.IDdl not present

springboot整合mybatis-plus关键报错信息 在处理mybatis-plus时遇到的问题&#xff0c;现提供解决方案供参考&#xff1a; org.springframework.beans.factory.BeanCreationException: Error creating bean with name com.baomidou.mybatisplus.autoconfigure.MybatisPlusAu…

队列 和 同步状态

文章目录 同步状态阻塞队列如何使用队列来实现广度优先搜索&#xff08;BFS&#xff09;算法条件队列如何使用条件队列实现生产者消费者模型 同步状态 在多线程编程中&#xff0c;同步状态是指用于控制并发访问共享资源的状态。同步状态的正确管理是确保多线程操作安全性和正确…

FastAPI+React全栈开发10 MongoDB聚合查询

Chapter02 Setting Up the Document Store with MongoDB 10 Aggregation framework FastAPIReact全栈开发10 MongoDB聚合查询 In the following pages, we will try to provide a brief introducton to the MongoDB aggregation framework, what it is, what benefits it of…

使用1panel部署Ollama WebUI(dcoekr版)浅谈

文章目录 说明配置镜像加速Ollama WebUI容器部署Ollama WebUI使用问题解决&#xff1a;访问页面空白 说明 1Panel简化了docker的部署&#xff0c;提供了可视化的操作&#xff0c;但是我在尝试创建Ollama WebUI容器时&#xff0c;遇到了从github拉取镜像网速很慢的问题&#xf…