我想执行以下形式的查询:
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。这可以实现吗?
答案 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这将是错误的!