当前位置: 首页 > 面试题库 >

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

越霖
2023-03-14
问题内容

所以我有一个旧数据库,正在迁移到新数据库。新版本的架构略有不同,但大多兼容。另外,我想从零开始重新编号所有表。

目前,我一直在使用编写的工具手动检索旧记录,将其插入新数据库,并更新旧数据库中的v2 ID字段以在新数据库中显示其对应的ID位置。

例如,我从MV5.Posts中选择并将其插入MV6.Posts。插入后,我在MV6.Posts中检索新行的ID,并在旧的MV5.Posts.MV6ID字段中对其进行更新。

有没有一种方法可以通过INSERT INTO SELECT FROM进行此更新,所以我不必手动处理每条记录?我正在使用SQL Server 2005开发版。


问题答案:

迁移的关键是要做几件事:首先,在没有当前备份的情况下不要做任何事情。其次,如果密钥将要更改,则需要至少临时将新旧结构都存储在新结构中(如果用户将密钥字段暴露给用户,则永久存在,因为他们可能正在搜索密钥字段以获取旧记录)。

接下来,您需要对与子表的关系有透彻的了解。如果更改键字段,则所有相关表也必须更改。这是同时存储新旧密钥的地方。如果您忘记更改其中任何一个,则数据将不再正确且将无用。因此,这是关键的一步。

挑选出一些特别复杂的数据的测试用例,以确保为每个相关表包括一个或多个测试用例。将现有值存储在工作表中。

要开始迁移,请使用旧表中的选择插入新表中。根据记录的数量,您可能希望遍历批处理(一次不一次记录)以提高性能。如果新密钥是一个标识,则只需将旧密钥的值放在其字段中,然后让数据库创建新密钥。

然后对相关表执行相同操作。然后,使用表中的旧键值将外键字段更新为:

Update t2
set fkfield = newkey
from table2 t2
join table1 t1 on t1.oldkey = t2.fkfield

通过运行测试用例,并将数据与迁移之前存储的数据进行比较,以测试迁移。彻底测试迁移数据绝对至关重要,否则您将无法确定数据是否与旧结构保持一致。迁移是一个非常复杂的动作。花费时间并非常有条理和彻底地做到这一点是值得的。



 类似资料:
  • 问题内容: 订单表具有如下数据: 运算符表: 组表: 如您所见,约翰有3个订单,凯特(Kate),威尔(Will),杰克(Jack)和山姆(Sam)没有。 现在,我想根据某些条件将操作员分配给订单: 订单现金必须大于0 订单必须具有状态= 1 订单必须在组1或2中 操作员必须处于活动状态(active = 1) 操作员必须在组1或2中 这是我想要得到的结果: 我想重新整理订单并更新operator

  • 问题内容: 寻找无错误的经过测试的SQL脚本,我可以在UDF中使用它来通过sql编码url。函数将接受一个URL并传递一个URL编码的URL。我已经看到了一些,但是我所遇到的一切似乎都存在一些缺陷。 问题答案: 为了使用此脚本,您将需要使用Numbers表。 该脚本在SQL Server Central 上完全可用(需要注册)

  • 问题内容: 我在Postgres 11.3数据库中有一个带有列的表。 尝试更新嵌套数组名称中的所有对象。 如果路径是对象,则应将路径从对象更新为具有以下值的字符串: 如果不存在该路径,则该对象应保持不变。 使用查询测试设置:小提琴链接 所需结果: 我已经修改了查询并链接到小提琴中。有人可以看看是否正确吗? 问题答案: 平原应该有所作为。 db <>在这里 拨弄 (Postgres 11!) 为了同

  • 问题内容: 我有两张桌子。表A和表B。 TableA包含一个varbinary(max)列-名为[BinaryA] TableB包含一个包含每个varbinary卷的列(名为“ Volume”,类型为“ Long”)。 为了选择我查询的所有卷 比,我想用它的体积更新tableB。 然后我写 我收到比 虽然我在运行时没有收到任何NULL 问题答案: 尝试使用此查询: 假设TableB和[VAULT]

  • 我想用Django更新一个表-类似这样的原始SQL: 我的第一个结果是这样的——但这很恶心,不是吗? 有没有更优雅的方式?

  • 问题内容: 我正在尝试提高SQL编程的效率。我正在尝试运行一个循环,以对仅按数字后缀更改的字段名称重复执行更新命令。 例如,而不是写出来,然后每次更新: 让我知道是否可以澄清。我正在使用SQL Server 2005。 感谢您的指导。 我正在尝试应用Adams的解决方案,并且需要了解以下N’的正确用法: 问题答案: 这实际上将不起作用,因为您不能在列名中加上引号。您实际上要做的是让SQL比较两个始