从多个插入查询中恢复生成的ID

时间:2010-07-29 21:37:53

标签: php sql mysql stored-procedures

我想执行以下形式的查询:

INSERT INTO表(field1,field2)SELECT field1,field2 FROM table WHERE id IN(4,8,15,16,23,42)

其中id是table的auto_increment'ing主键。

执行此语句后,我想知道刚刚生成的所有新id是什么。我该如何恢复这些信息?我感兴趣(也许)在存储过程中执行此操作并将新生成的id列表返回到我的应用程序代码(比如PHP),我希望列表与IN子句中出现的内容相关联SELECT子查询。我想这会在我的应用程序代码中省去很多顺序INSERT。这可以实现吗?

3 个答案:

答案 0 :(得分:3)

我不这么认为。至少不是以可靠的方式。 LAST_INSERT_ID()将从扩展插入返回第一个自动生成的id。您可以假设在此插入期间也插入了高于此值的所有内容,但在许多情况下这可能是错误的(特别是当一次有多个人在数据库上工作时)。

答案 1 :(得分:3)

如果您可以控制表(或者可以创建另一个表),那么存储“transaction_id?”

如果您将其添加到表格中,您可以执行以下操作:

Declare @tranId int
Select @tranId = Max(transaction_id) + 1 from [table]
Insert Into [table] (field1, field2, transactionId)
Select field1, field2, @tranId
From //the rest of your query

然后你要拔出新的ID:

Select Id from [table] where transaction_id = @tranId

作为一个注释,您需要立即作为存储过程的一部分运行该查询,或者您需要存储您在某处使用的transactionId,以便您可以提取正确的行而不必担心多个并发插入

答案 2 :(得分:0)

您只能获得最后一次插入ID,但您可以获得受影响的行...

所以ids将是

  $ids = range($lastID - (--$rows), $lastID);

- $ rows,因为你想保持最后一个id。

例如。最后一个插入是18和3行受影响所以16,17,18将是你的id但18 - 3将产生15,因此给ids 15,16,17,18这将是错误的!