【问题标题】:Get LAST_INSERT_ID() after INSERT and use it in following queries在 INSERT 之后获取 LAST_INSERT_ID() 并在以下查询中使用它
【发布时间】: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 语句中几乎是微不足道的,但是如果您不告诉我们您使用的是哪种编程语言,(也许显示一些代码,)我们无能为力。

标签: sql database sqlite last-insert-id


【解决方案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

【讨论】:

    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    相关资源
    最近更新 更多