美好的一天,
基本上,我有一个引用旧表的系统。但问题是,我有一个新表(与旧表相同,但主键不同),我想将我的系统引用到新表。当前系统已存储旧表中的外键。但是我想更新这些外部 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