我想在一个表中插入多行,使用一个 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字段或类似的内容;自动递增字段已给定,不能更改。)
2条答案
按热度按时间ukxgm1gy1#
如注解中所述,您可以捕获插入的ID(sql server):
9ceoxa922#
mysql和mariadb拥有
LAST_INSERT_ID()
函数,并返回由当前会话中最近的insert语句生成的id。但是当insert语句插入多行时,
LAST_INSERT_ID()
返回生成的集合中的第一个id。在这样一批多行中,您可以依赖后续id的连续性。例如,mysql jdbc驱动程序依赖于此。
如果插入的行包含id列的null值和非null值的混合值,则有可能弄乱此假设。jdbc驱动程序为生成的id集返回错误的值。