一位同事剛剛讓我意識到一個非常奇怪的MySQL行爲。爲什麼在失敗的插入時MySQL自動增量會增加?
假設您有一個帶有auto_increment字段和另一個字段設置爲唯一的表(例如用戶名字段)。當試圖插入一個已經在表中的用戶名的行時,插入失敗,如預期的那樣。然而,auto_increment值會增加,這是因爲在多次失敗嘗試後插入有效的新條目時可以看到。
例如,當我們的最後一個條目看起來像這樣...
ID: 10
Username: myname
......我們試圖用我們將創建一個新的行就像我們的下一個插入相同的用戶名值五個新項目所以:
ID: 16
Username: mynewname
雖然這不是它本身似乎是一個非常愚蠢的攻擊向量與失敗的插入請求淹沒它殺了表的一個大問題,因爲MySQL參考手冊的狀態:
「如果該值大於可以存儲在指定整數類型中的最大整數,則自動遞增機制的行爲未定義。」
這是預期的行爲嗎?
你的攻擊向量似乎非的問題。如果你可以用失敗的插入請求來洪水它,你不能同樣用非失敗的請求來洪水嗎? – 2010-05-07 10:52:22
您可以攜帶重現**代碼**而不是手動解釋嗎? – 2010-05-07 10:55:59
@martin smith:雖然這是真的,但我認爲突然涌現的新用戶會比auto_increment的沉默增加更明顯,如果沒有檢查的話,它可能會很好地落在旁邊。 – Sorcy 2010-05-07 12:40:40