2012-03-16 58 views
0

我有一個表,看起來像這樣MYSQL +更新ID列

CREATE TABLE IF NOT EXISTS `language` (
    `idkey` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `english_lang` text, 
    `japanese_lang` text, 
    PRIMARY KEY (`idkey`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1587 ; 

的「idkey」只是一個數字,從1個開始和增量。

的「idkey」目前從條目編號差距我刪除,我想看看是否有可能因此在編號之間沒有間隙運行MySQL命令重新寫這個專欄。

例如:重寫它,使它從1開始,一直運行到結束(大約1400個條目)。

謝謝

+0

看起來像idkey應該是一個主鍵,通常開始重新編號主鍵是一個壞主意。爲什麼要這樣做有特定的原因嗎? – Corbin 2012-03-16 08:02:55

+0

表是一個靜態表,它所涉及的網站也在開發中。主鍵也不涉及其他任何事情。只是希望修正訂貨之前,我去現場,但很難人工手動爲japanese_lang文本字段是unicode的,當我嘗試在大多數編輯器手動更新值都將丟失做......此外,它需要很長的時間來更新1400號......只是一個不錯的... hopeing有人可能知道一個簡單的MySQL更新命令,從而能夠重新寫一個這樣的列... – Adam 2012-03-16 08:10:14

回答

1

試圖填寫這些「缺失的數字」是違反標準做法的。你需要考慮到他們曾經被分配過某種東西。現在將它們分配給別的東西可能會導致問題 - 特別是如果您不使用外鍵約束並且有一些不良數據在使用。

如果您處於某種情況下,您測試了一些數據並且現在想要將事情處理好,可以通過運行Alter Table TABLENAME AUTO_INCREMENT=1(或任何其他數字)來重置自動增量,或者可以刪除並重新創建該表。如果它已經投入生產,我會建議不要重新設置或試圖「填補空白」。

爲了完整性,我相信你可以通過在你的插入語句中包含一個特定的數字來在正常的自動遞增列中插入一個特定的數字。下一個自動增量編號應該從您指定的那個中選取。如果它已經被採用,這會導致你的問題。

如果你真的只想縮小差距,最簡單的方法是創建一個具有相同結構的新表。然後運行如下查詢:

INSERT INTO 
    newtable (column2, column3, column4,...) 
VALUES 
    SELECT column2, column3, column4,... FROM oldtable; 

刪除舊錶並重命名新表。缺口將被填充,並且您的自動增量編號將位於「正確」位置。

但是您真的應該從已刪除的記錄中刪除差距。

+1

完美的答案。不要填補空白,因爲它們有意義(曾經有過的東西)。 – 2012-03-16 08:05:14

+0

理解 - 但該表不活,關鍵不涉及到任何東西。想你的alter table命令和編號仍然很零散.... – Adam 2012-03-16 08:11:05

+0

ALTER TABLE命令簡單地將其返回到任何你指定,那麼下一個ID將有回升。它不會自動選擇下一個空的ID。 要做的最簡單的事情是創建一個具有相同結構的新表,然後從當前表中刪除ID列中的數據。我會將其添加到答案中。 – Ilion 2012-03-16 08:13:02

0

是的,你可以這樣做,因爲主鍵是單行的每一行,如果你的列是自動增量,那麼你可以做到這一點,手動,你可以做到這一點。但是你問的是關於排序的問題,但是語法與創建表相關。