当行具有子项时,在数据库中复制行

时间:2010-08-06 13:06:14

标签: sql sql-server-2008

我需要在表中复制一行,并复制通过其他表中的外键链接到它的所有行。然后复制链接到这些行的所有行。

问题是当我复制该行时,密钥将会改变。如何通过表之间的关系传播这些更改?

3 个答案:

答案 0 :(得分:1)

有点像'hack',但我经常添加一个列'copy_of_id',这样我就可以存储旧的id,然后复制依赖表中所有行的新创建的值。

它不漂亮,但具有优势(例如,人类可追踪的事情)。

当然,您也可以使用辅助表。包含旧ID和新ID列。这不会污染你的主表。

答案 1 :(得分:1)

您可以编写一个实现所有复制逻辑的存储过程。

本质:

  1. 在主表格中插入副本行 - 将新ID存储在变量
  2. 插入 子表中每行的副本, 在变量中引用FK。将子行的ID存储在variable2
  3. 在表中插入新行,这取决于子表,引用变量2中的FK。
  4. 简而言之,编写一个从顶部开始的存储过程,并根据需要向下走多个表。

答案 2 :(得分:0)

创建新的“父行”时,@@ IDENTITY和SCOPE_IDENTITY()将包含新标头的ID。

然后您可以使用它们来创建“子行”,例如

INSERT INTO parent_table (parent_field1, parentfield2) VALUES('Some stuff', 'Other stuff');

INSERT INTO child_table (parent_id, other_field) VALUES(SCOPE_IDENTITY(), 'Etc.')

在MSDN上查看@@IDENTITYSCOPE_IDENTITY()代码示例。