我想知道是否可以重新填充mysql中的自動增量值。如何在mysql中重新填充/重新創建自動增量值
因爲,我有一個類似於記錄:
ID Name
1 POP
3 OLO
12 lku
基本上,我希望的方式來更新ID這個
ID Name
1 POP
2 OLO
3 lku
有什麼辦法mysql中做到這一點?
謝謝。
我想知道是否可以重新填充mysql中的自動增量值。如何在mysql中重新填充/重新創建自動增量值
因爲,我有一個類似於記錄:
ID Name
1 POP
3 OLO
12 lku
基本上,我希望的方式來更新ID這個
ID Name
1 POP
2 OLO
3 lku
有什麼辦法mysql中做到這一點?
謝謝。
這不是最好的做法來擺弄你的主鍵 - 最好讓你的數據庫自己處理它。如果在UPDATE
和ALTER
之間添加了另一條記錄,則可能會出現問題。因此,您必須使用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,你可以用它來更新你的其它表的外鍵依賴(在測試服務器上!)
變更主鍵是很糟糕的主意,因爲它危及你的參照完整性(如果另一個表使用該id,而不具有正確的「更改」的外鍵?)。
如果你真的,真的要做到這一點,不要計較不良副作用:
警告:
這將損害擁有該表的外鍵(但如果你有這樣的,那麼你就不會反正這樣做)每隔表。
你可能想嘗試像...
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。
不,我有數千條記錄要重新填寫,這些數據只是樣本。 – JPro 2010-03-16 13:29:40
已更新數千條記錄 – Andy 2010-03-16 13:42:55