在 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() “分配”给某种变量,以便我可以在以下查询中重用它。我已经尝试过WITHAS 以及所有这些,但都没有奏效。

(基本上我的编程头脑渴望类似: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() 并在以下查询中使用它的主要内容,如果未能解决你的问题,请参考以下文章

转 mysql中的LAST_INSERT_ID()分析

在 INSERT 之后获取 LAST_INSERT_ID() 并在以下查询中使用它

在 Oracle 上的 INSERT ... SELECT 之后获取插入的 ID

在sql中执行insert语句之前或之后获取记录的插入id

Mybatis 在 insert 之后想获取自增的主键 id

Mybatis 在 insert 之后想获取自增的主键 id,但是总是返回1