我有一组由id号索引的记录,我需要将这些记录的索引转换为新的id号。我有一个两列表将旧数字映射到新数字。
例如,给定这两个表,update语句会是什么样的?
假设:
OLD_TO_NEW
oldid | newid
-----------------
1234 0987
7698 5645
... ...
和
id | data
----------------
1234 'yo'
7698 'hey'
... ...
需要:
id | data
----------------
0987 'yo'
5645 'hey'
... ...
这个oracle所以我可以访问PL / SQL,我只是想避免它。
答案 0 :(得分:4)
我在OLD_TO_NEW.oldid
上有一个唯一索引,并在内联视图中更新:
update (select id,
newid
from old_to_new,
my_table
where my_table.id = old_to_new.oldid)
set id = newid
答案 1 :(得分:2)
UPDATE base_table SET id = (SELECT newid FROM old_to_new WHERE oldid = id)
这就是我在MySQL中的表现,我觉得这很标准。
答案 2 :(得分:0)
Ramon和David Aldridge的两个更新语句都可以正常工作,但根据要更新的记录数,使用这样的临时表可能会更快:
create table temp as (
select newid, data
from old_to_new join my_table on my_table.id = old_to_new.oldid);
然后截断旧表并将临时表复制到旧表中或删除旧表并重命名临时表。 (注意:添加一些额外的语句来处理没有新值的记录。)
答案 3 :(得分:0)
这就是我在Microsoft SQL Server 2005中的表现。多年来一直没有访问Oracle数据库,所以这可能不适用于Oracle。
UPDATE target_table
SET id = newid
FROM OLD_TO_NEW
WHERE target_table.id = OLD_TO_NEW.oldid;
您可能希望索引OLD_TO_NEW.oldid,以便更新联接可以有效运行。
答案 4 :(得分:0)
首先进行数据库备份。我还亲自在工作数据库中进行表备份,以防出现问题,你需要赶紧回到原来的方式。
下一个问题是您是否有需要这些ID的相关表格?如果否,则可以使用更新语句进行更新。写下您的更新语句,以便您可以进行选择并确保它将正确更新。如果你要做很多记录,你可能想要批量做,一次说1000条记录。您可能需要注意的情况是,如果ID的值重叠直接更新可能不起作用(您将遇到唯一索引)。在这种情况下,您需要添加一个列,使用新值填充它,然后删除旧列并重命名新列。你还需要编写所有索引,fks等脚本,因为你还需要重新运行它们。
相关表变得复杂得多,但新列也是这种情况的最佳方式。