Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用映射表更改大量记录键_Sql_Oracle_Sql Update - Fatal编程技术网

Sql 使用映射表更改大量记录键

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 =

我有一组按id编号索引的记录,我需要将这些记录的索引转换为新的id编号。我有一个两列表,将旧数字映射到新数字

例如,给定这两个表,update语句是什么样子的

鉴于:

   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;