回答

收藏

TSQL:使用INSERT INTO SELECT FROM进行更新

技术问答 技术问答 265 人阅读 | 0 人回复 | 2023-09-14

所以我有一个旧的数据库,正在迁移到新的数据库。新版本的结构略有不同,但大多数都是兼容的。此外,我想从零开始重新编号所有的表。/ F9 j( j( r/ w, Y
目前,我一直在使用编写工具手动检索旧记录,插入新数据库,更新旧数据库v2 ID在新数据库中显示相应的字段ID位置。0 H' ?, H+ m1 _/ |+ O( n1 k
例如,我从MV5.Posts选择并插入MV6.Posts。插入后,我在MV6.Posts中检索新行ID,并在旧的MV5.Posts.MV6ID更新字段。2 V3 ]/ `+ \; M# V0 U9 f
有没有一种方法可以通过INSERT INTO SELECT FROM进行此更新,所以我不必手动处理每条记录?我正在使用SQL Server 2005开发版。3 u/ v/ `( i; w# I8 F
                                                                * }9 O* k: w. u* r' j  ]6 J; O
    解决方案:                                                                ( B8 K+ I$ E# q
                                                                迁移的关键是做几件事:首先,不要在没有当前备份的情况下做任何事情。其次,如果要更改密钥,则至少需要临时存储新旧结构(如果用户将密钥字段暴露给用户,它将永久存在,因为他们可能正在搜索密钥字段以获得旧记录)。
+ H& n1 _' [, {' w6 Y$ f8 B接下来,你需要彻底了解与子表的关系。如果更改关键字段,所有相关表也必须更改。这是存储新旧密钥的地方。如果您忘记更改其中任何一个,数据将不再正确和无用。因此,这是关键步骤。8 }: b* J7 H" s
选择一些特别复杂的数据测试用例,以确保每个相关表包含一个或多个测试用例。将现有值存储在工作表中。
0 i$ W0 Q6 t0 ?要开始迁移,请将旧表中的选择插入新表中。根据记录的数量,您可能希望通过批处理(一次不记录)来提高性能。如果新密钥是一个标志,只需将旧密钥的值放入其字段中,然后让数据库创建新密钥。
# C1 Q: p4 m: U# X, p& l3 k2 z3 p然后对相关表执行相同的操作。然后,用表中的旧键值将外键字段更新为:8 t7 n3 Z, C, r. y* \; |
Update t2set fkfield = newkeyfrom table2 t2join table1 t1 on t1.oldkey = t2.fkfield通过运行测试用例,将数据与迁移前存储的数据进行比较,以测试迁移。彻底测试迁移数据是绝对重要的,否则您将无法确定数据是否与旧结构一致。迁移是一个非常复杂的行动。值得花时间和彻底。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则