mysql - 如何在一个 INSERT 上获取多行的插入 ID?

标签 mysql sql mariadb

我想使用单个 INSERT 语句将多行插入到表中。这没问题,因为 SQL 提供了为单个 INSERT 语句提供多行作为参数的选项。现在,这些行包含一个自动递增的 ID 字段,即它的值由数据库设置,而不是由我的代码设置。

因此,我想获取插入行的 ID 值。我的基本问题是:如何为 MariaDB/MySQL 做到这一点?

事实证明,这很简单,例如在 PostgreSQL 中,因为 PostgreSQL 有 RETURNING clause for INSERT它返回一行甚至多行的所需值。这正是我想要的,而且有效。

不幸的是,MariaDB 和 MySQL 都没有 PostgreSQL 的 RETURNING 子句,所以我需要回退到诸如 LAST_INSERT_ID() 之类的东西,但这只会返回 ID 最后插入的单个行,即使使用单个 INSERT 插入了多个行。如何获取所有 ID 值?

我的代码目前看起来像这样:

INSERT INTO mytable
  (foo, bar)
VALUES
  ('fooA', 'barA'),
  ('fooB', 'barB');

SELECT LAST_INSERT_ID() AS id;

我怎样才能以一种即使在并发写入时也能正常工作的方式解决这个问题?

(不,它不是更改为 UUID 字段或类似内容的选项;自动递增字段已给出,无法更改。)

最佳答案

MySQL 和 MariaDB 有 LAST_INSERT_ID() 函数,它返回当前 session 中最近的 INSERT 语句生成的 ID。

但是当您的 INSERT 语句插入多行时,LAST_INSERT_ID() 返回生成的集合中的第一个 id。

在这样一批多行的情况下,可以保证后面的id是连续的。例如,MySQL JDBC 驱动程序依赖于此。

如果您插入的行包含 id 列的 NULL 和非 NULL 值的混合,您就有搞乱这个假设的风险。 JDBC 驱动程序为生成的 ID 集返回了错误的值。

关于mysql - 如何在一个 INSERT 上获取多行的插入 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50102817/

相关文章:

mysql - 如何获取此 mysql 表的每月总和?

基于公共(public)字段的SQL查询

apache-spark - 使用PySpark从MariaDB读取查询

php - 帮助显示 MySQL 数据库中的数据

php - XAMPP MySQL 关闭

mysql - 从字符串中提取特定值(MYSQL)

从字符串转换日期和/或时间时 C# 转换失败

php - PDO 查询在结果集中返回每个字段两次

mysql - MariaDB:选择 val_1、max(value_2)、按 value_3 分组

javascript - 使用 jQuery AJAX 更新 mysql 表