使用地图表更改大量记录键

时间:2009-11-02 16:46:16

标签: sql oracle sql-update

我有一组由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,我只是想避免它。

5 个答案:

答案 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等脚本,因为你还需要重新运行它们。

相关表变得复杂得多,但新列也是这种情况的最佳方式。