在 INSERT 之后获取 LAST_INSERT_ID() 并在以下查询中使用它
Posted
技术标签:
【中文标题】在 INSERT 之后获取 LAST_INSERT_ID() 并在以下查询中使用它【英文标题】:Get LAST_INSERT_ID() after INSERT and use it in following queries 【发布时间】:2021-01-12 09:06:06 【问题描述】:我在一个表中插入一行,例如:
INSERT INTO first (name) VALUES ('something');
然后获取该行的自动递增 ID,例如:
SELECT LAST_INSERT_ID();
然后,我想在一系列 INSERT 中使用这个特定的 ID,例如:
INSERT INTO second (f,a,b) VALUES (ID, 'something else', 'with something else');
INSERT INTO second (f,a,b) VALUES (ID, 'something else 1', 'with something else 3');
INSERT INTO second (f,a,b) VALUES (ID, 'something else 2', 'with something else 4');
问题是:我如何将第一个 LAST_INSERT_ID() “分配”给某种变量,以便我可以在以下查询中重用它。我已经尝试过WITH
和AS
以及所有这些,但都没有奏效。
(基本上我的编程头脑渴望类似:ID = SELECT LAST_INSERT_ID();
,然后继续执行下一个查询......但我不知道该怎么做。)
【问题讨论】:
这个问题有 [sqlite] 标签,但没有编程语言标签。 SQLite 几乎总是在用某种编程语言编写的应用程序中使用,这些编程语言肯定不是 SQL。将SELECT LAST_INSERT_ID();
的结果放入您的编程语言的变量中,然后将其放入您的INSERT
语句中几乎是微不足道的,但是如果您不告诉我们您使用的是哪种编程语言,(也许显示一些代码,)我们无能为力。
【参考方案1】:
SQLite 不支持 sql 语句中的变量。
如果您已将表first
的列ID
定义为:
ID INTEGER PRIMARY KEY AUTOINCREMENT
那么你知道最后插入的值是表的最大值ID
,所以你可以像这样向表second
插入行:
INSERT INTO second (f,a,b) VALUES ((SELECT MAX(ID) FROM first), 'something else', 'with something else');
如果您确定first
中至少有 1 行。
或者更好:
WITH
cte(a, b) AS (
VALUES ('something else', 'with something else'),
('something else 1', 'with something else 3'),
('something else 2', 'with something else 4')
)
INSERT INTO second (f, a, b)
SELECT f.id, c.a, c.b
FROM (SELECT MAX(id) id FROM first) f
CROSS JOIN cte c
WHERE f.id IS NOT NULL
请参阅demo。
【讨论】:
以上是关于在 INSERT 之后获取 LAST_INSERT_ID() 并在以下查询中使用它的主要内容,如果未能解决你的问题,请参考以下文章
在 INSERT 之后获取 LAST_INSERT_ID() 并在以下查询中使用它
在 Oracle 上的 INSERT ... SELECT 之后获取插入的 ID