2010-04-15 80 views
17

我有一個簡單的MySQL表和主索引(id)不是一個一個編號(1,31,35,100等)。我想讓它們像(1,2,3,4)一樣被編號。請告訴我該怎麼做。我還想指出,我意識到這次手術可能帶來的後果,但我只想整理一下這張桌子。如何重新編號主索引

回答

35

我同意其他方法將工作,但我只是給一個不同的想法。這將做沒有任何臨時表創建要求::

SET @i=0; 
UPDATE table_name SET column_name=(@i:[email protected]+1); 
+1

它不會重置auto_increment值,所以如果你的auto_increment是1344,更新後你只能得到id 100,下一行將會有id 1344,再次創建一個洞。 Ofc可以在更新後手動設置auto_increment。 – dbemerlin 2010-04-15 08:05:29

+1

oFcourse你必須更新自動增量;我錯過了指定。 ALTER TABLE TABLENAME auto_increment =​​; – 2010-04-15 08:16:44

+1

是啊,這是偉大的,但有一件事要考慮:重複編號 – 2016-11-07 03:01:05

0

你必須定義自動遞增的主鍵(如果它是主鍵)

這裏有一個鏈接:

sql autoincrement

+2

-1:這不回答這個問題。如果您刪除自動增量值爲2的行,那麼您在ID中有一個洞。這是他想改變的。 – dbemerlin 2010-04-15 07:38:19

+0

但是你不能阻止整體,因爲你允許刪除你的記錄。因此,創建一個新表格只會暫時幫助 – 2010-04-15 07:46:21

2
CREATE TABLE newtable 
    LIKE oldtable 
    SELECT NULL, col1, col2, col3, etc FROM oldtable; 

,而不包括主鍵列在選擇,但所有其他列。

而主鍵列應該在表格中第一位,或者您需要將NULL設置爲主鍵列的位置。列應該有一個「NOT NULL」設置。否則它將被設置爲空,這是毫無意義的。

這個工作的原因是因爲MySQL喜歡忽略auto_increments上的NULL插入,而是爲它創建一個新的數字(假定null不是該列上的有效值)。

2
  1. 刪除「id」列。
  2. 使用自動增量創建名爲id的列(並且不允許爲空值),它將具有所需的新值。
  3. 將此新的「id」列指定爲PK。

感謝意見後編輯。

+0

一次只能有一個自動增量列,所以如果你想遵循這個配方,你可以做一個捷徑:1.刪除舊列。 2.做一個新的。 – 2010-04-15 07:37:25

+0

是的,我忘記了。 – Numenor 2010-04-15 15:14:50

4

最簡單的解決辦法是:

  • 重命名錶tablename_temp
  • 與舊名稱和相同的結構創建一個新表
  • INSERT INTO表名(ID,字段1,字段2,字段3) SELECT NULL,field1,field2,field3,... FROM tablename_temp;
  • DROP tablename_temp

如果您正在使用外鍵,我強烈建議你離開的ID,因爲它們是這會破壞您的所有數據。數據庫不是不整潔的,因爲主鍵不是按順序排列的,如果數據庫的參照完整性(指向其他表中錯誤或不存在的行的ID值)被破壞,則數據庫是不整潔的。

13

給一個嘗試重新編號dalmp的方法(DALMP Database Abstraction Layer for MySQL using PHP.

$db->renumber('table','uid'); 

基本上它這樣做:

SET @var_name = 0; 
UPDATE Tablename SET ID = (@var_name := @var_name +1); 
ALTER TABLE tablename AUTO_INCREMENT = 1 
+0

奇妙的@tareco,這是完美的一個不同但相似的問題,當你想從一個SQL轉儲到一個表中導入記錄,並找到衝突的主鍵值。我在導入之前在目標表上運行了你的sql命令,並且它完美地工作。 – AdamJones 2014-09-05 02:53:14

1

你不不需要它。主鍵不是一個數字。這只是無意義的獨特序列。