2

假设您有两个表处于一对一关系;即子表的主键也是将其链接到父表的外键。还假定父项的主键是标识字段(插入记录时由数据库分配的单调递增整数)。在SQL中复制与标识字段的1对1关系

假设您需要将这两个表中的记录复制到第二对相同的表中 - 父项的主键是标识,将子项链接到父项的外键也是子项的主键。

我应该如何将一组表中的记录复制到另一组表中?

我目前有三个解决方案,但我想知道是否还有其他人更好。

  • 选项1:在目的地 父表暂时禁用 身份属性。复制来自 父表的记录,然后复制子表 保持 主键的相同值。跨越你的手指, 没有冲突( 源表的主键已在目标表中存在 )。

  • 选项2:暂时列添加到 目的地父表保持 “旧”(源)主键。从父表中复制 记录, 允许数据库分配新的主键 ,但将旧主键保存在临时列中。 从子表, 通过的 旧的主键加入源子表的 目的地父表复制记录,利用加盟 插入记录到 目的地子表与新 主键。从目标父 表中删除临时 列。

  • 选项3:复制顺序 记录由记录,首先从父 到父,然后儿童对儿童,使用 DB-提供的功能的“最后 插入记录的身份”,以确保 该链接保持不变。

在这些选项中,我认为选项2是我的偏好。有没有人更喜欢其他两种选择之一,如果是这样,为什么?有没有人有不同的“更好”的解决方案?

回答

1

这就是为什么记住即使使用代理键(如标识列)也非常重要的原因之一,您总是需要一个业务密钥。也就是说,表格中总是需要有一些其他的唯一约束条件。如果有,则另一种选择是将值插入父表的副本中,而不使用标识值,并使用该唯一键为子行插入正确的父值。

如果您没有这个唯一的密钥,那么考虑到您的情况,我同意您的最佳解决方案可能是选项2。

+0

不幸的是,虽然大多数表具有自然的组合业务密钥,但有三个表没有。 :( – 2011-03-08 23:12:38

0

你决定的方法将数据复制到一组新表之前,您应该研究以下项目:

  1. 引用从父和子表中的数据(这两套表格的表的列表)
  2. 是否有任何存储过程/触发器利用这些表中的数据?
  3. 此表如何填充?有没有在此表中插入数据的应用程序/数据馈送?
  4. 此表中的数据如何删除?
  5. 除了确保表中的唯一性之外,主键的用途是什么?为此,您将必须了解应用程序如何使用表中的数据。

根据答案,您应该能够选择符合应用要求的正确解决方案。

0

我的钱在选项1上(请参阅SET IDENTITY INSERT,http://msdn.microsoft.com/en-us/library/ms188059.aspx)。

但是:你为什么要复制它们?

  • 如果你只是改变表模式,或迁移到新表和退役旧的,为什么不使用ALTER TABLE
  • 如果您要并排运行它们,您可能需要按键才能匹配。

但回答你的问题,绝对使用选项1。