【问题标题】:INSERT INTO SELECT How to return set of insert IdsINSERT INTO SELECT 如何返回一组插入 ID
【发布时间】:2023-03-07 17:41:01
【问题描述】:

我有一个有效的INSERT INTO SELECT 查询,它根据选择的结果将记录插入到新表中。简单的。

INSERT INTO my_table (a, b, c)
SELECT a, b, c FROM my_table 
WHERE x=y;

如何从该查询的INSERT 部分获取新创建的主键 ID,以便我可以使用它们来更新另一个表? (主键是唯一的唯一引用)

我读到INSERT INTO SELECT 只支持每个查询插入一个表,所以这是不可能的。如何实现(使用 MyISAM 引擎)?

【问题讨论】:

  • 创建一个存储过程并使用循环单独插入记录,以便轻松获取最后插入的id。存储此 ID 并返回
  • 是的,我想这是显而易见的解决方案。但如果可能的话,我宁愿牺牲那个解决方案来换取性能和更简洁的代码。

标签: mysql


【解决方案1】:

您可以在临时表中选择您的数据,然后在插入行时在其上运行光标,您将获得 PK

     DECLARE @tempTable TABLE(
    a VARCHAR(MAX),
    b VARCHAR(MAX),
    c VARCHAR(MAX)
    )

    INSERT INTO @tempTable(a,b,c)
    SELECT a,b,c FROM my_table WHERE x=y

DECALRE @a DATATYPE;
Declare @b DATATYPE;
Declare @c DATATYPE;

DECLARE cursor CURSOR FOR
    SELECT * FROM @tempTable

OPEN cursor 

FETCH NEXT FROM PropertyCursor INTO @a, @b,@c
WHILE (@@FETCH_STATUS = 0)
BEGIN
 INSERT INTO my_table(a,b,c)
VALUES(@a,@b,@c)
DECALRE @PrimaryKey INT = SCOPE_IDENTITY();//THis line will give u the PK so u can work with it and then below move to next row
FETCH NEXT FROM cursor INTO @a, @b,@c
END

CLOSE cursor 
DEALLOCATE cursor 

【讨论】:

  • Apurav,你能说得更具体一点吗?那么,假设我将 SELECT 的结果放入一个临时表中,这将如何产生主键?
  • 查看我的编辑,在您插入后,您将有一个局部变量来保存生成的 PrimaryKey,以便使用它。还要为你的变量使用正确的数据类型。
猜你喜欢
  • 1970-01-01
  • 2016-05-04
  • 2012-06-20
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
相关资源
最近更新 更多