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

news/2024/7/21 4:57:48 标签: excel, android

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.niftyadmin.cn/n/5454568.html

相关文章

用docker在局域网虚拟一个docker虚拟机,支持单独ip,gpu,systemd,在docker里面安装docker

可以实现局域网内虚拟一台linux服务器&#xff0c;效果类似虚拟机&#xff0c;用docker实现&#xff0c;需要注意&#xff0c;这种方式和宿主机是不能通讯的&#xff0c;但是可以和局域网内的设备通讯 觉得好用可以加作者wx: lx-ivan 编写dockerfile vim Dockerfile FROM u…

Redisson 实现分布式锁

1. 介绍 Redisson 是一个 java 操作 Redis 的客户端。 提供了大量的分布式数据集来简化对 Redis 的操作和使用&#xff0c;可以让开发者像使用本地集合一样使用 Redis&#xff0c;完全感知不到 Redis 的存在。 2. 种引入方式 spring boot starter 引入&#xff08;不推荐&…

Intellij IDEA 类注释模板设置

1、配置全局USER 在此配置全局USER&#xff0c;用于填充自动生成的注释中的作者author属性。 注释模板中的user参数是默认是获取系统的用户&#xff08;当然注释作者也可以直接写固定值&#xff09;&#xff0c;如果不想和系统用户用同一个信息&#xff0c;可以在IDEA中进行配…

【42 可视化大屏 | 某瓣电影Top250数据分析可视化大屏】

文章目录 &#x1f3f3;️‍&#x1f308; 1 普版大屏&#x1f3f3;️‍&#x1f308;2 Flask版大屏&#x1f3f3;️‍&#x1f308;3 FlaskMysql版大屏&#x1f3f3;️‍&#x1f308; 4. 可视化项目源码数据 大家好&#xff0c;我是 &#x1f449;【Python当打之年(点击跳转)…

Encoding类

Encoding System.Text.Encoding 是 C# 中用于处理字符编码和字符串与字节之间转换的类。它提供了各种静态方法和属性&#xff0c;**用于在不同字符编码之间进行转换&#xff0c;**以及将字符串转换为字节数组或反之。 在处理多语言文本、文件、网络通信以及其他字符数据的场景…

pulsar: 批量接收消息

接收消息时&#xff0c;和kafka类似&#xff0c;如果topic有多个分区&#xff0c;则只能保证分区内数据的接收有序&#xff0c;不能保证全局有序。 一、发送消息 package cn.edu.tju.test1;import org.apache.pulsar.client.api.*;public class BatchProducer01 {private sta…

自然语言处理3(NLP)—— 机器学习

1. 自然语言处理在机器学习领域的主要任务 自然语言处理&#xff08;NLP&#xff09;在机器学习领域中扮演着至关重要的角色&#xff0c;旨在使计算机能够理解、解释和生成人类语言。以下是NLP在机器学习领域中的主要任务及其分类方法&#xff1a; 1.1 按照功能类型分类 1.1.…

Nuxt2 渲染时html比css加载快,导致闪屏/CSS样式迟滞/抖动问题记录

问题场景&#xff1a; 最近在用Nuxt2重写公司官网&#xff0c;但因为笔者不是专业前端&#xff0c;之前虽然也用vue2来写前端&#xff0c;但是用nuxt2来写项目还是第一次。在开发过程中虽然也磕磕碰碰&#xff0c;但因为开发的是官网&#xff0c;偏CMS型的网站&#xff0c;所以…