Sql 使用映射表更改大量记录键
我有一组按id编号索引的记录,我需要将这些记录的索引转换为新的id编号。我有一个两列表,将旧数字映射到新数字 例如,给定这两个表,update语句是什么样子的 鉴于:Sql 使用映射表更改大量记录键,sql,oracle,sql-update,Sql,Oracle,Sql Update,我有一组按id编号索引的记录,我需要将这些记录的索引转换为新的id编号。我有一个两列表,将旧数字映射到新数字 例如,给定这两个表,update语句是什么样子的 鉴于: OLD_TO_NEW oldid | newid ----------------- 1234 0987 7698 5645 ... ... 及 需要: 这是oracle,所以我可以访问PL/SQL,我只是试图避免它 UPDATE base_table SET id =
OLD_TO_NEW
oldid | newid
-----------------
1234 0987
7698 5645
... ...
及
需要:
这是oracle,所以我可以访问PL/SQL,我只是试图避免它
UPDATE base_table SET id = (SELECT newid FROM old_to_new WHERE oldid = id)
我在MySQL中就是这样做的,我认为这是相当标准的。我会在
OLD\u TO\u NEW.oldid上有一个唯一的索引,并在内联视图上更新:
update (select id,
newid
from old_to_new,
my_table
where my_table.id = old_to_new.oldid)
set id = newid
Ramon和David Aldridge的update语句都可以正常工作,但根据要更新的记录数,使用这样的临时表可能会更快:
create table temp as (
select newid, data
from old_to_new join my_table on my_table.id = old_to_new.oldid);
然后截断旧表并将临时表复制到旧表中,或者删除旧表并重命名临时表。(注意:在没有新值的记录中添加一些额外语句来处理。)这是我在Microsoft SQL Server 2005中的做法。多年来没有访问Oracle数据库的权限,因此这可能不适用于Oracle
UPDATE target_table
SET id = newid
FROM OLD_TO_NEW
WHERE target_table.id = OLD_TO_NEW.oldid;
您可能希望将旧的_索引到_NEW.oldid,以便更新联接能够高效运行。首先进行数据库备份。我还亲自在工作数据库中做一个表备份,以防出现问题,您需要尽快回到原来的方式
下一个问题是您是否有也需要这些ID的相关表?如果否,则可以使用update语句进行更新。写下你的更新声明,这样你就可以选择并确保它会正确更新。如果要做大量记录,可能需要成批做,比如说一次做1000条记录。您可能需要注意的一种情况是,如果ID的值重叠,则直接更新可能无法工作(您将遇到唯一索引)。在这种情况下,您需要添加一列,用新值填充它,然后对旧列进行delte并重命名新列。您还需要编写所有索引、FK等的脚本,因为您还需要重新运行它们
相关表变得更加复杂,但新列也是处理这种情况的最佳方式。AFAIK将更新基本表中的每一条记录,即使新旧表中没有相应的记录。有效地尝试将一堆id设置为NULL。假设旧的到新的不是详尽的,是的,但问题中没有提到有效的。假设没有外键约束到正在更新的表上。我曾经看到有人这样做,发生级联删除火灾,意外地删除了一堆或真正重要的数据。啊,但是如果对正在更新的表有FK约束,那么截断将出错。正如我所说,除了“简单”的更新语句之外,此解决方案还有一些缺点。。但是性能可以更好。-1:oracle不支持WHERE语法的更新集。很抱歉
create table temp as (
select newid, data
from old_to_new join my_table on my_table.id = old_to_new.oldid);
UPDATE target_table
SET id = newid
FROM OLD_TO_NEW
WHERE target_table.id = OLD_TO_NEW.oldid;