我想使用单个 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/