从旧表引用和新表引用更新表列



美好的一天,

基本上,我有一个引用旧表的系统。但问题是,我有一个新表(与旧表相同,但主键不同),我想将我的系统引用到新表。当前系统已存储旧表中的外键。但是我想更新这些外部 ID 以正确引用新表。问题是,旧表由数百条记录组成,我不知道应该使用什么查询来更新引用新表的系统表。

包含示例数据的旧表列(包含数百条记录)

| CompanyId |      Name      |
|   4301    |   Apple Inc.   | 
|   4302    |   Microsoft    | 

包含示例数据的新表列(具有旧主键但不同的相同数据)

| CompanyId |      Name      |
|   1002    |   Apple Inc.   | 
|   1003    |   Microsoft    | 

下面是我的示例表,其中包含旧公司表中的外键。

| CustomerId |  CompanyId  |  CustomerName  |
|     1      |     4301    |  John E. Doe   |
|     2      |     4301    |  Lorem K. Fox  |

我知道的唯一过程是手动逐个创建查询。

UPDATE Customer SET CompanyId=1002 WHERE CustomerId=1

但这是一个坏主意,因为我正在处理数百条记录。

请帮忙吗?

您可以使用join. 假设名称相同:

update s
set s.companyid = nt.companid
from samples s join
oldtable ot
on s.companyid = ot.companyid join
newtable nt
on ot.name = nt.name;

现在一些注意事项:

  • 您需要删除外键约束才能正常工作。 之后应将其添加回去。
  • 如果某些名称不匹配,这可能不会更新表中的所有行。
  • 如果不是更新所有行,则生成的 ID 可能会混合 - 一些到旧表,一些到新表。

您确实指定了这些表"相同",因此我猜这些不是您的特定情况的问题。

您将需要创建一个映射表来将旧表中的 ID 链接到新表。

所以在你的例子中:

mappingtable
| oldcompanyid | newcompanyid |
|    4301      |     1001     |
|    4302      |     1002     |

然后,您可以通过从旧密钥连接到新密钥来更新客户表:

update s
set s.companyid = nt.companyid
from samples s join
mappingtable t on s.companyid=t.oldcompanyid join 
newtable nt
on t.newcompanyid = nt.companyid 

最新更新