使用不同的值更新数千行

时间:2017-03-17 23:08:36

标签: mysql sql

我写了一个小程序,它在数据库中重新排序我们的一些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和值在多个表中更新值!有没有简单的方法来运行更新查询"一次性#34;所以数据库与已经更新的ID不冲突?

1 个答案:

答案 0 :(得分: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中的索引仅在您拥有大量更新时才会出现。分析器应根据其假设使用或不使用索引。