2010-03-16 71 views
5

我想知道是否可以重新填充mysql中的自動增量值。如何在mysql中重新填充/重新創建自動增量值

因爲,我有一個類似於記錄:

ID Name 
1 POP 
3 OLO 
12 lku 

基本上,我希望的方式來更新ID這個

ID Name 
1 POP 
2 OLO 
3 lku 

有什麼辦法mysql中做到這一點?

謝謝。

回答

3

這不是最好的做法來擺弄你的主鍵 - 最好讓你的數據庫自己處理它。如果在UPDATEALTER之間添加了另一條記錄,則可能會出現問題。因此,您必須使用LOCK表,該表可能會掛起其他查詢並在繁忙的生產服務器上加載負載。

LOCK TABLES table WRITE 
UPDATE table SET id=3 WHERE id=12; 
ALTER TABLE table AUTO_INCREMENT=4; 
UNLOCK TABLES 

OR - 千行(沒有foriegn鍵依賴):

CREATE TEMPORARY TABLE nameTemp(name varchar(128) not null) 
INSERT INTO name SELECT name FROM firstTable 
TRUNCATE firstTable 
INSERT INTO firstTable SELECT name FROM nameTemp 

,你有沒有外鍵後一種方法纔有效。如果你這樣做,你需要一個查找表。

CREATE TEMPORARY TABLE lookup(newId INTEGER AUTO_INCREMENT, oldId INTEGER, PRIMARY KEY newId(newId)); 
INSERT INTO lookup (oldId) SELECT id FROM firstTable 
[do temp table queries above] 

您現在有一個lookup表與舊到新的ID,你可以用它來更新你的其它表的外鍵依賴(在測試服務器上!)

+0

不,我有數千條記錄要重新填寫,這些數據只是樣本。 – JPro 2010-03-16 13:29:40

+0

已更新數千條記錄 – Andy 2010-03-16 13:42:55

0

變更主鍵是糟糕的主意,因爲它危及你的參照完整性(如果另一個表使用該id,而不具有正確的「更改」的外鍵?)。

如果你真的,真的要做到這一點,不要計較不良副作用:

  • 創建具有相同結構的第二個表
  • INSERT INTO NEW_TABLE(ID,[其他字段] )SELECT NULL,[other fields] FROM old_table;
  • DROP old_table;
  • RENAME new_table old_table;

警告:
這將損害擁有該表的外鍵(但如果你有這樣的,那麼你就不會反正這樣做)每隔表。

0

你可能想嘗試像...

Create Temporary table MyBackup 
( ID as your autoincrement, 
    OldID as Int for backlinking/retention, 
    RestOfFields as their type) 

insert into MyBackup 
( OldID 
    RestOfFields) 
select 
    ID as OldID, 
    RestOfFields 
    from 
    YourOriginalTable 
    order by 
    ID (this is your original ID) 

然後你就會有一個新表與分配新的ID自動增量,但有自己的原始ID的完整副本。然後,您可以對其他表進行關聯更新,並設置ID = ID,其中ID = OldID。通過按照原始ID的順序保留您的插入,它將保持數字不會被順序替換。例如:如果你的表是orderd爲 舊ID = 3,新的ID = 1個 舊ID = 1,新ID = 3 舊ID = 12,新的ID = 2

你的老3的將成爲11,則1的將成爲3的,和12的成爲2的

舊ID = 1,新的ID = 1 舊ID = 3,新的ID = 2 舊ID = 12,新的ID = 3

你3的韓元不會覆蓋更高的數字,並且這12個將不會與3的衝突,因爲這三個已經降到2。