如何在一次插入中获得多行的插入ID?

643ylb08  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(385)

我想在一个表中插入多行,使用一个 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;

如何以一种即使在并发写操作下也能工作的方式来解决这个问题?
(不,不能选择更改为uuid字段或类似的内容;自动递增字段已给定,不能更改。)

ukxgm1gy

ukxgm1gy1#

如注解中所述,您可以捕获插入的ID(sql server):

use tempdb

create table test (
    id int identity(1,1) primary key,
    t varchar(10) null
)

create table ids (
    i int not null
)

insert  test(t)
output  inserted.id into ids
values (null), (null), (null)

select  *
from    test

select  *
from    ids
9ceoxa92

9ceoxa922#

mysql和mariadb拥有 LAST_INSERT_ID() 函数,并返回由当前会话中最近的insert语句生成的id。
但是当insert语句插入多行时, LAST_INSERT_ID() 返回生成的集合中的第一个id。
在这样一批多行中,您可以依赖后续id的连续性。例如,mysql jdbc驱动程序依赖于此。
如果插入的行包含id列的null值和非null值的混合值,则有可能弄乱此假设。jdbc驱动程序为生成的id集返回错误的值。

相关问题