2010-07-29 112 views
1

生成的ID我想要執行的形式的查詢:恢復從多個插入查詢

INSERT INTO表(FIELD1,FIELD2)SELECT FIELD1,FIELD2 FROM表WHERE ID。在(4,8,15,16, 23,42)

其中,id是table的auto_increment主鍵。

執行這個語句後,我想知道剛纔生成的所有新ID是什麼。我怎樣才能恢復這些信息?我感興趣的是(可能)在存儲過程中這樣做,並將新生成的ID列表返回給我的應用程序代碼(可以說PHP),我希望列表與IN子句中出現的內容相關的SELECT子查詢。我認爲這會爲我在應用程序代碼中節省大量順序INSERT。這是可以實現的嗎?

回答

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,以便您可以拔出正確的行而不用擔心多個併發插入操作。

+0

做一個重寫到MySQL,你可能有一個點:) – Wrikken 2010-07-29 21:54:59

+0

當它完全錯過了MySql標籤。不知道如何...雖然唯一不會通用的大多數品種的Sql將是Max()的調用,我會認爲... – AllenG 2010-07-29 21:58:08

+0

然而,這是一個有趣的答案...如果我只是保留了一個只有id字段的虛擬表,然後有人希望執行這種查詢,可以首先對虛擬表進行插入操作,從中可以恢復插入標識,從而成爲它們的transaction_id「ticket」。然後我可以在INSERT INTO ... SELECT語句中選擇它作爲常量。只要插入發生「按順序」,我應該隨後可以通過在我的事務標籤上按SELECT排序來恢復它們......想法? – vicatcu 2010-07-29 22:04:40

3

我不這麼認爲。至少不是以可靠的方式。 LAST_INSERT_ID()將從擴展插入中返回第一個自動生成的ID。您可以假定在插入過程中插入的內容都高於此值,但在許多情況下這可能是錯誤的(特別是一次有多個人在處理數據庫時)。

+0

確實無法可靠工作。在一個存儲過程中,你可以用一個光標在select上循環,做單個插入。 – Wrikken 2010-07-29 21:44:15

+0

@Wrikken - 是的,如果他們是Eeeeevillll! ;) – AllenG 2010-07-29 21:46:20

+0

會比從我的應用程序代碼(即通過網絡)順序發出查詢快得多嗎? – vicatcu 2010-07-29 21:46:23

0

你只能得到最後插入ID,但你可以得到受影響的行...

所以IDS將

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

- $行,只要你想保持過去的ID太。

例如。最後一個插入是18和3排受到影響,因此16,17,18將是你的id,但是18-3會產生15,因此給出15,16,17,18,這將是錯誤的!

+0

可以說你有更多像8000行受到影響... – vicatcu 2010-07-29 21:48:56

+0

也是如此...... – 2010-07-30 08:22:27

+0

我認爲問題在於你無法保證插入的發生不會中斷......所以我不能保證有順序auto_increment id的生成沒有中斷。 – vicatcu 2010-08-02 15:15:58