我写了一个小程序,它在数据库中重新排序我们的一些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不冲突?
答案 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中的索引仅在您拥有大量更新时才会出现。分析器应根据其假设使用或不使用索引。