首页 > 解决方案 > 从 MySQL 中的多插入获取 LAST_INSERT_ID()

问题描述

在我的 MySQL 数据库中插入多行后,我需要获取我的 id 值

INSERT INTO table (`row1`, `row2`, `row3`, `row4`)
VALUES
('value1','value2','value3','value4'),
('value1','value2','value3','value4');

事实上,我需要类似 SQL Server - INSERT 之后的返回值, 但对于 MySQL,我不需要返回最后一个 id,因为我可以自己做,但我认为这对我所做的事情没有好处是更好的方法我的问题存在吗?

标签: phpmysqldatabase

解决方案


如果要将行块插入父表和子表中,则行必须具有唯一列,以便在插入后查找父行:

INSERT INTO table (col1, col2, col3, col4)
VALUES
('value1','value2','value3','value4'),
('value5','value6','value7','value8');

INSERT INTO childtable (colx, coly, id_table)
SELECT 1, 2, id FROM table WHERE col1 = 'value1' and col2 = 'value2' and col3 = 'value3' and col4 = 'value4'
UNION ALL
SELECT 1, 2, id FROM table WHERE col1 = 'value5' and col2 = 'value2' and col3 = 'value3' and col4 = 'value4'

即使有一种方法可以获取所有插入的 ID,您也必须做同样的事情,因为表包含一组无序的行。如果您为第一个插入语句返回 ID 11 和 12,那么 ID 11 将引用哪一行以及 ID 12 是哪一行?没有办法说出来,因为 DBMS 可以自由地以任何顺序插入行。

如果行数据不像您的示例那样是唯一的,其中两行都包含 ('value1','value2','value3','value4'),那么您必须将所有数据插入循环中或使用一些 CTE首先对行编号并使用这些数字。

无论如何,说了这么多,我会在一个循环中逐行插入数据(即一个父级,它的所有子级,下一个父级,...),只要您不会遇到无法忍受的性能问题。


推荐阅读