2017-03-17 38 views
-2

我編寫了一個小程序,對數據庫中的一些ID進行了重新排序,以保持易維護性,並且不需要編輯其他程序。它工作得很好,但我遇到了問題。基本上我現在正在更新像這樣的行;更新數千行不同的值

UPDATE data SET id = 100 WHERE id = 2000; UPDATE data SET id = 101 WHERE id = 2001; UPDATE data SET id = 102 WHERE id = 2002; ... 

這一個工作得很好,但不是在所有情況下;

UPDATE data SET id = 100 WHERE id = 2000; 
UPDATE data SET id = 2001 WHERE id = 100; -- Conflight, now the last row got updated again with wrong id 

該值需要跨指定ID和值的多個表進行更新!有沒有簡單的方法來運行更新查詢「一次全部」,這樣數據庫不會與已更新的id發生衝突?

+0

是的,ID確實是主鍵 – user7729575

+0

有人插入意外ID爲20億,我們的表即將使整數溢出需要我們重新排序 – user7729575

回答

0

你可以做的,是這樣的:

添加另一列 「NEWID」,併發出一個附加的更新中底:

UPDATE data 
SET newid = 100 
WHERE id = 2000; 
UPDATE data 
SET newid = 2001 
WHERE id = 100; 

中底:

UPDATE data 
SET id = newid, 
     newid = NULL 
WHERE newid IS NOT NULL; 

無論如何,你需要確保你不分配一個id兩次。

的另一種方法是使用只存在於內存中的臨時表:

CREATE TEMPORARY TABLE idDict AS (
    oldID: int, 
    newID: int, 
    index oid(oldID) 
) ENGINE = MEMORY; 

INSERT INTO idDict (oldID,newID) 
VALUES 
(2000,100), 
(100,2001), 
... 
; 

UPDATE data 
JOIN idDict 
ON  data.id = idDict.oldID 
SET data.id = idDict.newID; 

DROP TEMPORARY TABLE idDict; 

注:這裏idDict該指數只有當你有一個非常大的一堆更新。根據其假設,分析儀應正確使用或不使用該指數。

+0

它並不那麼簡單!我需要更新相同的ID約五個不同的表,只有指定的! – user7729575

+0

這個問題沒有說明。 – Psi

+0

編輯了這個問題,對不起 – user7729575