MySQL 使用 LAST_INSERT_ID() 在多个表上批量插入

2024-02-17

我正在尝试将大量用户插入到具有两个表的 MySQL 数据库中:

第一个表包含用户数据。一个例子INSERT看起来像这样(id是主键,mail是唯一的键):

INSERT INTO users (id, mail, name)  
VALUES (NULL, "[email protected] /cdn-cgi/l/email-protection", "John Smith") 
ON DUPLICATE KEY UPDATE name = VALUE(name)

第二个表包含用户所属的组。它只存储两个外键users_id and groups_id。示例查询如下所示:

INSERT INTO users_groups (users_id, groups_id)
VALUES (LAST_INSERT_ID(), 1)

此设置非常适合小型数据集。当我导入大量数据(>1M 行)时INSERT速度变慢了。显然,批量插入会更好:

INSERT INTO users (id, mail, name)  
VALUES (NULL, "[email protected] /cdn-cgi/l/email-protection", "John Smith"), (NULL, "[email protected] /cdn-cgi/l/email-protection", "Anna Smith") 
ON DUPLICATE KEY UPDATE name = VALUE(name)

and:

INSERT INTO users_groups (users_id, groups_id)
VALUES (LAST_INSERT_ID(), 1), (LAST_INSERT_ID(), 4)

问题当然是,LAST_INSERT_ID()只返回批次的一个(第一个)idINSERT.
所以,我需要的是一个“嵌套”批次INSERT,IMO 在 MySQL 中不存在。

我能做些什么来让我的INSERT更快吗?


默认情况下,批量插入提供顺序自动增量,有了这些知识,您就可以像这样进行插入:

INSERT INTO users (id, mail, name)  
VALUES  (NULL, "[email protected] /cdn-cgi/l/email-protection", "John Smith"), 
        (NULL, "[email protected] /cdn-cgi/l/email-protection", "Anna Smith"),
        (...)  # repeat n-times
;

SET @LASTID=LAST_INSERT_ID()
;

INSERT INTO users_groups (users_id, groups_id)
VALUES    (@LASTID - n  , 1), # Note n in descending sequence
          (@LASTID - n-1, 1),
          ...
          (@LASTID - 1  , 1), 
          (@LASTID - 0  , 4)
;

有关批量插入和自动增量的更多信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html

重要的是,确保 innodb_autoinc_lock_mode=1

show global variables like 'innodb_autoinc_lock_mode'

否则请考虑将您的插入物包裹在LOCK TABLES

LOCK TABLES tbl_name WRITE
... sqls ...
UNLOCK TABLES
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 使用 LAST_INSERT_ID() 在多个表上批量插入 的相关文章

  • 在 MySQL 中对整数字段运行带引号的数字(字符串)查询时会发生哪些复杂情况

    在 SQL 中 不应引用整数 因为如果引用 它将是一个字符串 但我很好奇如果我这样做会出现什么问题 并发症 例如 SELECT FROM table WHERE id 1 正确的 vs SELECT FROM table WHERE id
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • 如何停止在 mongodb 集合中插入重复文档

    让我们有一个MongoDB包含三个文档的集合 db collection find id user A title Physics Bank Bank A id user A title Chemistry Bank Bank B id u
  • PostgreSQL 中“-”处或附近的语法错误

    我正在尝试运行查询来更新用户密码 alter user dell sys with password Pass 133 但因为 它给了我这样的错误 ERROR syntax error at or near LINE 1 alter use
  • MySQL 排序顺序 - 排序规则?

    我在对 MySQL 中的 char 字段进行排序时遇到困难 问题是重音字符与非重音字符混淆 例如 Abc bd Acc 我认为这可能与整理有关 所以我将表格的排序规则更改为utf8 ut8 bin 看完之后这个帖子 https stacko
  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • 我应该用不可变或可变的数据结构来表示数据库数据吗?

    我目前正在使用 Scala 进行编程 但我想这适用于任何函数式编程语言 或者更确切地说 任何建议不变性并可以与数据库交互的编程语言 当我从数据库中获取数据时 我将其映射到模型数据结构 在函数式编程中 数据结构往往是不可变的 但是数据库中的数
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 如何从批量数据中的mysql列中删除所有非数字字符

    我想从列中删除所有非数字字符 我的数据库中有大量数据 目前我正在使用以下链接中描述的方法 http venerableagents wordpress com 2011 01 29 mysql numeric functions http
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • 如何处理数据库中的巨大结果集

    我正在设计一个多层数据库驱动的 Web 应用程序 SQL 关系数据库 用于中间服务层的 Java 用于 UI 的 Web 语言其实并不重要 中间服务层执行数据库的实际查询 用户界面只是要求某些数据 并不知道它是由数据库支持的 问题是如何处理
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • Flutter 中有预填充数据库使用的示例吗?

    Flutter 中有预填充数据库使用的示例吗 我不需要 CRUD 示例 此时我只需要从数据库读取数据即可 我是 Flutter 新手 所以一步一步的教程会很好 您可以将您的应用程序与预填充的 sqlite 数据库捆绑在一起assets文件夹

随机推荐

  • javascript RegEX 在模式中带有圆括号

    下面的脚本返回 null 如果我删除 str 和 patt1 中文本 spot Northeast 300 comment 的圆括号 它会正确返回 在我的应用程序中 str中的值是从cookie中获取的 patt1中的值是基于打开的窗口的动
  • 更改类内的类变量引用

    我希望能够更改 Test 类中变量的引用 class Test def change self Other Class self class Other Class class self Other class Other def set
  • 如何应用程序使用来自不同文件的所有路由

    我正在尝试分离我的路线 之前我将它们包含到我的 app js 中 后端 app js const express require express const router require routes const status requir
  • jQuery:如何计算所有匹配元素的最大属性值?

    考虑以下 HTML div class a div div class a div div class a div div class a div 你会如何找到最大值x一切的价值 a元素 假设所有x值为正整数 只需循环它们即可 var ma
  • 如何在 EF Core 2.x 中重新加载集合?

    我知道有一个Load method dbContext Entry blog Collection b gt b Posts Load 但我正在尝试处理并发冲突 我已经添加了一个post into blog Posts 如果打电话Load
  • 如何在不使用临时文件的情况下从Java中的嵌套zip文件中读取数据?

    我正在尝试从嵌套的 zip 存档中提取文件并在内存中处理它们 这个问题是什么not about 如何在 Java 中读取 zip 文件 不 问题是如何读取 zip 文件中的 zip 文件 等等 如嵌套的 zip 文件 将临时结果写入磁盘 不
  • 从C# webservice返回多维数组数据到vba

    我有一个返回 2D 数组数据的 C Web 服务 由于我们不能让 Web 服务返回多维数据 所以我让它返回一个锯齿状数组 OperationContract object WSGetData 我有一个 COM Visible C 类库 这是
  • 当我尝试运行 Flutter 程序时,它会卡在“正在运行 Gradle 任务 'assembleDebug”

    每当我尝试在模拟器或真实设备上运行时 它都会卡在 Running Gradle task assembleDebug 整个计算机就会死机并卡住 唯一的出路就是硬重启它 我使用的是华硕笔记本电脑 Windows 10 配备 16GB 内存 f
  • 跳过 R 中 lme 循环中的错误警告

    我正在尝试自动化我的 R 脚本来执行一个包含大量分析的循环 目前我已经搁浅了让它在失败的 CI 测试期间向我发出警告并继续处理下一个响应变量 我分别尝试过 tryCatch 和 try 有人可以告诉我我做错了什么以及如何修改吗 这可能是一些
  • 不支持 Path.isConvex。 Android Studio - 切换按钮

    我已经在 stackoverflow 上读到过这个问题 但不幸的是还没有找到正确的答案 我使用 ToggleButton 它在渲染窗口中显示以下错误 The graphics preview in the layout editor may
  • 通道是否通过引用隐式传递

    gotour 有这个频道示例 https tour golang org concurrency 2 https tour golang org concurrency 2 package main import fmt func sum
  • simpleGrid 是否需要额外下载?

    我想尝试一下简单网格 http knockoutjs com examples grid html在 HotTowel 项目中 当谈到 this gridViewModel new ko simpleGrid viewModel data
  • 为什么 C# 不允许泛型属性?

    我想知道为什么我不能像拥有泛型方法一样在非泛型类中拥有泛型属性 IE public interface TestClass IEnumerable
  • Pycharm 在调试模式下在未知断点处停止

    我在基于 django 的项目中使用 pycharm 进行开发 在调试模式下 Pycharm继续在我没有放置任何断点的地方停止执行代码 这些断点位于我的requirement txt 文件中并且在我的项目中需要的包的核心代码中 而不是在我的
  • MVC5 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException

    我一直致力于将 MVC4 项目转换为 MVC5 第一天 我遇到了 Microsoft CSharp RuntimeBinder RuntimeBinderException 但能够通过重新开始转换来解决它 我不确定修复了什么 这很糟糕 因为
  • Caffe 快照:.solverstate 与 .caffemodel

    训练网络时 每 N 次迭代拍摄的快照有两种形式 一个是 solverstate 文件 我想它就像它听起来的那样 存储损失函数和梯度的状态等 另一个是 caffemodel 文件 我知道它存储训练后的参数 如果您想要预训练的模型 caffem
  • 期望空值时抛出异常?

    如果我期望一个 null 值并获得一个定义的值 在属性的 getter 内 并想要抛出异常 那么在 csharp 中执行此操作的正确方法是什么 在这种情况下是否已经定义了一些有意义的内容 我的猜测是 throw new ArgumentEx
  • JavaScript 中的 .find() 和 .includes() 有什么区别?

    我正在尝试创建一个名为 addTrack 的方法 具有以下功能 接受轨道参数 使用轨道的 id 属性来检查是否 当前歌曲处于 playlistTracks 状态 如果 id 是新的 则将歌曲添加到播放列表的末尾 设置播放列表的新状态 如果我
  • 如何在nodejs中创建僵尸/失效进程?

    这里有很多帖子 例如https unix stackexchange com questions 217507 zombies in bash https unix stackexchange com questions 217507 zo
  • MySQL 使用 LAST_INSERT_ID() 在多个表上批量插入

    我正在尝试将大量用户插入到具有两个表的 MySQL 数据库中 第一个表包含用户数据 一个例子INSERT看起来像这样 id是主键 mail是唯一的键 INSERT INTO users id mail name VALUES NULL em