2015-04-29 47 views
0

我有一個三列表:idforeign_idtag。此表上的查詢首先按foreign_id排序,然後按tag排序,但我們希望棄用tag列,以支持更可靠且自動生成的id。爲此,我們還需要保留tag列中存儲的訂購數據,而不保留tag。此排序僅適用於foreign_id列的範圍。MySQL更新AUTO_INCREMENT PK以保留行排序

爲了解決這個問題,我們決定在每個foreign_id的範圍內更新id,使得ID的順序保留tag訂單信息。

如何更新AUTO_INCREMENT主鍵列,以便在計數器中分配下一個值而不更改行的其餘部分?

或者,如何將整個行(減去pk)複製到新行並刪除舊行?

+0

如果你問的ID爲1-N爲每個foreign_id,MyISAM仍然可以通過使auto_increment字段只是主鍵的一部分來支持這一點。我不認爲ALTER會相應地更新這些值。如果這就是你要找的東西,我可以提供一個查詢來在這樣的ALTER執行後更新數據。 – Uueerdo

回答

0
SELECT MAX(id) INTO @maxID FROM the_table; 
UPDATE the_table SET id = id + @maxID; 
SET @i := 0; 
UPDATE the_table SET id = (@i := @i + 1) ORDER BY foreign_id, tag; 

我不是百分之百的積極,這將工作;我通常不用UPDATE語句來做這種事情。或者,您可以替換與更新時間:

INSERT INTO the_table(id, foreign_id, tag) 
SELECT (@i := @i + 1) AS `new_id`, foreign_id, tag 
FROM the_table 
ORDER BY foreign_id, tag 
; 
DELETE FROM the_table 
WHERE id >= @maxID 
; 

在任何情況下,這種假設目前id值總是> = 0