如何在一个INSERT上插入多行的ID?

Gol*_*den 2 mysql sql mariadb

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

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

事实证明,这是相当简单的,例如,在PostgreSQL中,作为PostgreSQL有所述RETURNING用于子句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;
Run Code Online (Sandbox Code Playgroud)

如何解决此问题的方式即使在并发写入时也能正常工作?

(不,它不是更改为UUID栏中选择一个选项,或者是这样的;自动递增场,并给出了不能更改.)

Bil*_*win 6

MySQL和MariaDB具有该LAST_INSERT_ID()函数,它返回当前会话中最新INSERT语句生成的id.

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

在这样一批多行中,您可以依赖后续的id连续.例如,MySQL JDBC驱动程序依赖于此.

如果您插入的行包含id列的NULL和非NULL值的混合,则存在弄乱此假设的风险.JDBC驱动程序为生成的id集返回错误的值.

  • 重要的是进一步补充一点,在繁忙的系统上,多个查询可能会尝试在几乎相同的时刻插入多行.在这种情况下,您仍然可以安全地假设连续插入,因为数据库应该使用锁定和事务(如果需要,隐式),以确保这些查询不会互相踩到脚趾. (4认同)