MySQL 批量插入记录报 Error 1390 (HY000)
文章目录
- 1.背景
- 2.问题
- 3.分批插入
- 4.一次最多能插入多少条记录?
- 5.什么是 Prepared Statement?
- 参考文献
1.背景
Golang 后台服务使用 GORM 实现与 MySQL 的交互,在实现一个通过 Excel 导入数据的接口时,使用 Save 方法一次性插入大量记录(>1w)时报了如下错误:
Error 1390 (HY000): Prepared statement contains too many placeholders
2.问题
在 MySQL 官方文档 Server Error Message Reference 可以看到其描述。

该错误属于 MySQL 服务端错误,可惜的是,官方文档并未给出详细的错误原因,只给出了错误码的简短描述。错误描述字面意思是“预处理语句包含太多占位符”,结合业务场景,猜测原因是一次插入太多记录。
3.分批插入
既然不允许一次插入太多记录,那么可以改为分批插入,而不是一次性插入所有数据。
// 待插入的记录。
records := parseRecordsFromExcel()
batch := 1000for i := 0; i < len(records ); i += batch {end := i + batchif end > len(records) {end = len(record)}return Db.Save(records[i:end]).Error
}
正如预期的那样,改为分批插入,解决了问题。
不知道你有没有疑问,我这里分批插入每批记录数是 1000,那可以采用 2000 或者其他数量吗?每批插入记录数的上限是多少呢?
带着这个疑问,请继续往下看。
4.一次最多能插入多少条记录?
MySQL 服务端之所以报 Error 1390 (HY000) 错误,直接原因是一次插入过多的记录,但更深层次的原因是 MySQL SQL 语句的占位符数量有上限,最大值为 16bits 无符号整数的最大值(65535)。
可以在 sql/sql_prepare.cc 中看到相关代码:
static bool init_param_array(THD *thd, Prepared_statement *stmt) {LEX *lex = stmt->m_lex;if ((stmt->m_param_count = lex->param_list.elements)) {if (stmt->m_param_count > static_cast<uint>(UINT_MAX16)) {/* Error code to be defined in 5.0 */my_error(ER_PS_MANY_PARAM, MYF(0));return true;}...
}
如果是 INSERT 语句,插入 n 条记录,每条记录有 m 列,则要求 m*n <= 65535。
如果数据量很大,最简单的解决方法,就是进行分批插入。
5.什么是 Prepared Statement?
上面的错误信息中提到了 Prepared statement,那么什么是 Prepared statement?为什么插入语句会涉及到占位符呢?
一条 SQL 在 DB 接收到最终执行完毕返回,大致的过程如下:
- 词法和语义解析。
- 优化 SQL 语句,制定执行计划。
- 执行并返回结果。
如果一条 SQL 经历上面所有的流程处理,一次编译,单次运行,此类普通语句被称作立即语句(Immediate Statement)。
但是,绝大多数情况下,某些 SQL 语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。如果每次都需要经过上面的词法语义解析、语句优化,则效率明显很低。
如果事先解析优化好 SQL 语句,一次编译,多次运行,这种 SQL 被称为预处理语句(Prepared Statement)。
在 MySQL 中,Prepared Statements 是一种预编译 SQL 语句的机制,它可以帮助提高 SQL 的性能和安全性。
预编译语句的优势在于:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。
# 定义预处理语句
PREPARE stmt_name FROM preparable_stmt;# 执行预处理语句
EXECUTE stmt_name [USING @var_name [, @var_name] ...];# 删除(释放)定义
{DEALLOCATE | DROP} PREPARE stmt_name;
下面看一个例子:利用字符串定义预处理 SQL,根据勾股定理计算直角三角形斜边。
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
Query OK, 0 rows affected (0.00 sec)
Statement preparedmysql> SET @a = 3;
Query OK, 0 rows affected (0.00 sec)mysql> SET @b = 4;
Query OK, 0 rows affected (0.00 sec)mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
| 5 |
+------------+
1 row in set (0.00 sec)mysql> DEALLOCATE PREPARE stmt1;
Query OK, 0 rows affected (0.00 sec)
参考文献
Chapter 2 Server Error Message Reference
How many bind variables can I use in a SQL query in MySQL 5?
MySQL的SQL预处理(Prepared) - GeaoZhang
MySQL 8.0 Reference Manual :: 13.5 Prepared Statements
相关文章:
MySQL 批量插入记录报 Error 1390 (HY000)
文章目录 1.背景2.问题3.分批插入4.一次最多能插入多少条记录?5.什么是 Prepared Statement?参考文献 1.背景 Golang 后台服务使用 GORM 实现与 MySQL 的交互,在实现一个通过 Excel 导入数据的接口时,使用 Save 方法一次性插入大…...
线程池(用于处理Runnable任务或Callable任务)
一,线程池 二, 如何创建线程池 案例: //1,通过ThreadPoolExecuter创建一个线程池对象ExecutorService pool new ThreadPoolExecutor(3,5,8,TimeUnit.SECONDS,new LinkedBlockingQueue<>(4),Executors.defaultThreadFactory(),new Thr…...
MATLAB在信号系统中的应用
1.产生一个幅度为1, 基频为2Hz,占空比为50%的周期方波.要求画出图形。 在MATLAB中,函数square(w0*t, DUTY)产生基本频率为w0 (周期T2*pi/w0)、占空比DUTY (τ/T)*100的周期矩形波(方波),默认情况下占空比DUTY50。占空…...
Jenkins与Docker的自动化CI/CD流水线实践
Pipeline 有诸多优点,例如: 项目发布可视化,明确阶段,方便处理问题 一个Jenkins File文件管理整个项目生命周期 Jenkins File可以放到项目代码中版本管理 Jenkins管理界面 操作实例:Pipeline的简单使用 这里是比较…...
企业数字化转型的作用是什么?_光点科技
在当今快速变化的商业环境中,数字化转型已成为企业发展的重要策略。企业数字化转型指的是利用数字技术改造传统业务模式和管理方式,以提升效率、增强竞争力和创造新的增长机会。 提升运营效率:数字化转型通过引入自动化工具和智能系统&#x…...
css加载会造成阻塞吗??
前言 前几天面试问到了这个问题,当时这个答得不敢确定哈哈,虽然一面还是过了 现在再分析下这个,总结下,等下次遇到就能自信得回答,666 准备工作 为了完成本次测试,先来科普一下,如何利用chr…...
Java中的jvm——面试题+答案(JVM的高级概念和调优技巧,包括垃圾回收、内存分析、优化技术等)——第16期
涉及Java虚拟机(JVM)高级概念和调优技巧的面试题以及简要答案: 什么是JVM调优?有哪些常见的JVM调优参数? 答案: JVM调优是通过调整JVM的参数和配置,以提高Java应用程序的性能和稳定性。常见的JV…...
***Linux下Mysql的安装
以下是在Linux系统下安装MySQL的步骤: 1.访问MySQL官网下载页面(https://dev.mysql.com/downloads/mysql/),选择适合您Linux系统的版本进行下载。 2.下载完成后,解压缩文件并将其移动到/usr/local目录下:…...
Linux踩坑:arm下gcc编译添加 -Ox 优化后,程序无法正常运行
arm下gcc编译添加 -Ox 优化后,程序无法正常运行 一、问题描述 今天学习正点原子的阿尔法开发板裸机开发的时候,遇到了一个问题,在没有使用 -Ox 优化的时候,编译出来的程序能够正常运行,但是添加了-Ox之后,…...
Vue3中Composition API介绍
在Vue 3中,引入了Composition API,它是一种新的组合式函数API,用于更灵活地组织和重用组件逻辑。Composition API相比于Vue 2中的Options API,提供了更好的可组合性和代码复用性。下面是对Vue 3中Composition API的介绍和用法&…...
虚拟机系列:(VMware Workstation Pro)Centos7下搭建Android开发环境及Android真机调试
一、Android SDK 安装配置 1、环境 Linux系统为:Red Hat Enterprise Linux 7 64 位 ; 当然还需要Java环境,java 环境这里不叙述; 2、Android Studio 安装 (1)下载位置: http://www.android-studio.org/ 我这里下载的:android-studio-ide-191.5977832-linux.tar.gz …...
全面(16万字)深入探索深度学习:基础原理到经典模型网络的全面解析
前言 Stacking(堆叠) 网页调试 学习率:它决定了模型在每一次迭代中更新参数的幅度激活函数-更加详细 激活函数的意义: 激活函数主要是让模型具有非线性数据拟合的能力,也就是能够对非线性数据进行分割/建模 如果没有激活函数: 第一个隐层: l…...
openEuler Linux 部署 FineBi
openEuler Linux 部署 FineBi 部署环境 环境版本openEuler Linux22.03MySQL8.0.35JDK1.8FineBi6.0 环境准备 升级系统内核和软件 yum -y updatereboot安装常用工具软件 yum -y install vim tar net-tools 安装MySQL8 将 MySQL Yum 存储库添加到系统的存储库列表中 sudo…...
QThreadStorage使用介绍
作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 什么是线程数据存储Qt中的线程数据存储`QThreadStorage` 的用法:代码示例什么是线程数据存储 线程数据存储是指为每个线程在程序中分配和管理数据的过程。它主要用于并发编程…...
AI和人工智能与机器学习全景报告
今天分享的是AI系列深度研究报告:《AI和人工智能与机器学习全景报告》。 (报告出品方:appen) 报告共计:30页 获取 数据获取仍是AI应用构建团队的主要瓶颈。 原因各不相同。例如,特定用例的数据可能不足…...
【计算机网络】(网络层)定长掩码和变长掩码
目录 1、IPV4地址的应用规划 2、例题分析 2.1、定长的子网掩码 2.2、变长的子网掩码 1、IPV4地址的应用规划 定长的子网掩码(FLSM): 使用同一个子网掩码划分子网,每个子网所分配的IP地址数量相同,造成IP地址的浪费…...
008 OpenCV matchTemplate 模板匹配
目录 一、环境 二、模板匹配算法原理 三、代码演示 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、模板匹配算法原理 cv.matchTemplate是OpenCV库中的一个函数,用于在图像中查找与模板匹配的特征。它的主要应用场景…...
PTA 海盗分赃
P 个海盗偷了 D 颗钻石后来到公海分赃,一致同意如下分赃策略: 首先,P 个海盗通过抽签决定 1 - P 的序号。然后由第 1 号海盗提出一个分配方案(方案应给出每个海盗分得的具体数量),如果能够得到包括 1 号在…...
零基础学Linux内核:1、Linux源码组织架构
文章目录 前言一、Linux内核的特征二、Linux操作系统结构1.Linux在系统中的位置2.Linux内核的主要子系统3、Linux系统主要数据结构 三、linux内核源码组织1、下载Linux源码2、Linux版本号3、linux源码架构目录讲解 前言 这里将是我们从零开始学习Linux的第一节,这节…...
STM32中Msp函数的意义
msp(MCU Support Package) 举个例子:串口初始化函数HAL_UART_Init()与串口底层初始化函数HAL_UART_MspInit() HAL_UART_Init()用于初始化串口通讯协议如波特率、有效位等 HAL_UART_MspInit()用于初始化于MCU相关的配置比如时钟、NVIC、GPI…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
MeshGPT 笔记
[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...
