2011-08-28 75 views
0

比方說,我們有一個(InnoDB的)表associations其中具有以下結構的MySQL數據庫:瞭解MySQLs行爲增加一個增量主鍵時事後

CREATE TABLE `associations` (
     `id` int(11) NOT NULL AUTO_INCREMENT, 
    `fk_id_1` int(11) NOT NULL, 
    `fk_id_2` int(11) NOT NULL, 
    `fk_id_3` int(11) DEFAULT NULL, 
     PRIMARY KEY (`id`), 
    UNIQUE KEY `some_unique_constraint` (`fk_id_1`,`fk_id_2`), 
    KEY `fk_id_2_INDEX` (`fk_id_2`), 
    KEY `fk_id_3_INDEX` (`fk_id_3`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin$$ 

id跳躍 (我知道這是在多線程嘗試獲取自動增量值時如何生成的問題)。由於沒有其他表使用列id作爲參考,我打算刪除列id並再次創建它,希望計數孔將消失。我備份了我的數據庫並進行了測試。結果有點令人困惑。行的順序似乎已經改變。如果我沒有弄錯,那麼訂單首先由fk_id_1然後fk_id_2然後fk_id_3

這是自然秩序中,MySQL會將這些表格,assignung一個新生成的自動增量鍵值對行的時候?

是否有更多我應該知道,在此過程中發生了什麼?

原因是,爲什麼我需要知道這一點,我需要使id列有用於我打算完成的另一項任務,即在差距不大的情況下。

回答

4

在任何主流RDBS中,表格都沒有自然順序。

只有最外層的ORDER BY在SELECT語句將保證結果的順序。

如果你想 「訂單」:

  • 創建新表
  • INSERT..SELECT..ORDER BY fk_id_1,fk_id_2,fk_id_3
  • 刪除舊錶
  • 重命名新表

或與差距生活在一起...強迫症對開發人員不利

編輯:

問題說這個值「無依賴」,但事實證明是有的。

如果不允許有間隔則不要使用自動編號,並使用fk_id_1,fk_id_2,fk_id_3爲您的鑰匙,用ROW_NUMBER仿真。或者編碼你的下游來處理差距。

Autonumbers將有差距:生命的不可改變的事實。

+0

我需要使這一列有用於我打算完成的另一項任務,即在差距不大的情況下。不過謝謝你的回答! – Aufwind

+0

@Aufwind:已更新。你應該在問題 – gbn

+0

問題中更新。感謝編輯! – Aufwind