2013-08-23 62 views
4

我們希望從mySQL中獲得一個自動遞增ID,而不實際存儲它,直到其他非mysql相關進程成功完成爲止,以便在發生異常或應用程序崩潰時不存儲條目。我們需要使用ID作爲其他進程的關鍵。實質上,我們希望「保留」自動增量並將行插入到mySQL中作爲最後一步。在我們知道整個過程已成功完成之前,我們不想插入任何行。保留mySQL自動遞增的ID?

是否可以在mySQL中進行這種自動增量保留?

注意:我知道SQL事務。但是我們的流程包含了需要在數據庫之外發生的非SQL內容。這些過程可能需要幾分鐘到幾個小時。但我們不希望任何其他進程使用相同的自動增量ID。這就是爲什麼我們想要一個「保留」一個自動遞增的ID,而沒有真正將任何數據插入數據庫。 -

+0

請問您能提供更多細節嗎?大致有以下幾點:(1)一個過程開始。 (2)對DB感興趣。 (3)還有其他的事情......等等。 – Greeso

+0

你可能不會使用自動增量。如果您將當前的id計數器存儲在其他地方的小表中,那麼當您的外部進程開始時,它可以獲取當前的id並將其增加。在發生崩潰時,ID可能會被跳過,但不會重複。 –

+0

@AldenW。請參閱Bill Karwin的迴應。你認爲這是一個好方法嗎? –

回答

6

生成自動增量值的唯一方法是嘗試插入。但是,您可以回滾該事務,並仍然讀取生成的標識。在MySQL 5.1和更高版本中,默認行爲是自動遞增值在回滾時不會「返回」到堆棧。

START TRANSACTION; 
INSERT INTO mytable() VALUES(); 
ROLLBACK; 
SELECT LAST_INSERT_ID() INTO @my_ai_value; 

現在你可以確信沒有其他事務將嘗試使用該值,這樣你就可以在你的外部進程使用它,最後插入值手動使用該值id當您插入(具體的id值,MySQL不會生成新的值)。

+0

嗨比爾。這確實是一個有用的迴應。聽起來就像我們需要的。你以前試過這種方法嗎?我們應該注意什麼? –

+1

表中的所有其他列都需要允許NULL或具有默認值。否則,您需要爲這些列指定虛擬值。 –

+0

比爾,如果多個進程同時執行這個操作會發生什麼情況 - 因爲選擇是在回滾之後發生的,是否有可能檢索到另一個進程正在檢索的相同數量? –

1

你有沒有考慮過使用mysql tranactions?

它的本質是,你開始一個事務,如果所有的sql語句都是正確的並且可以被壓縮,那麼你提交你的事務。如果沒有,那麼就像沒有任何事情一樣回滾。

更多細節可以在這個鏈接閱讀: http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-transactions.html

+0

這可能是最好的解決方案(鑑於問題的簡短描述,很難確定)。問題海報應該注意的一個重要細節是交易僅適用於InnoDB表格。 –

+0

謝謝。我瞭解SQL事務。但是我們的流程包含了需要在數據庫之外發生的非SQL內容。這些過程可能需要幾分鐘到幾個小時。但我們不希望任何其他進程使用相同的自動增量ID。這就是爲什麼我們想要一個「保留」一個自動遞增的ID,而沒有真正將任何數據插入數據庫。 –

+0

@SaqibAli 您能否介紹一下您的問題?看起來好像有很多事情需要考慮,但是沒有在描述中。 – Greeso