t sql在级联表中复制行

时间:2009-02-06 16:48:29

标签: sql-server-2005 tsql

我有一种情况,我有几个相关/级联表。让我们说所有1对多的关系级联table1,table2,table3,table4等。我所拥有的是表中的默认行。它们以table1中的1条记录开头,并在其他表中有1条或更多相关记录。

我正在寻找的是一种简单的方法来复制行并为每个行创建/维护新的主键。通过维护我的意思是,table1.ID1被复制,所以现在有一个table1.ID2,其余的列都是相同的,只有ID已经改变。

最重要的是,所有其他表中的所有相关行都被复制,foreigns键/主键都指向新的。

因此table2的table1.ID2的外键是table2.ID#的主键,table2行的其余列与table2中复制的行相同。

我很懒,试图摆脱管理ID并创建一个非常长的存储过程。

我不认为这可以做到,但我希望我错了。提前谢谢。

2 个答案:

答案 0 :(得分:1)

我们最近必须在一个项目中为某些功能执行此操作。

我们最终使用递归存储过程来完成它。每次通话都需要两条信息:

  • 记录重复的表的名称
  • 正在复制的表的父表的主键

因此,如果您有两个表A和B,其中A.aid是A的主键,而B.aid引用它,则需要在伪代码中执行以下操作:

Function deep_copy (table, parent)
  For each record in table whose parent is parent
    Create a new PK and copy this record
    For each subtable of table
      Call self with parameters (subtable, newPK)

您要为要复制的A的每条记录调用deep_copy。然后deep_copy将自己调用B中需要复制的记录,以及任何其他兄弟表到B.捕获是你需要元信息才能知道B是A的孩子。我们碰巧有已经存储了元信息,所以我们没有做任何特殊的事情来获取它。

最终不是一个非常大的存储过程。如果你的PK都是标识列,那么它就会变得更容易。尽管如此,它还是分了很多。不完全是一种有效的算法。但是,这又是一个固有的复杂问题,关系数据模型的设计并不适合优雅地处理。

答案 1 :(得分:0)

触发器就是为此而创建的。然而,良好的触发器难以编写并且难以维护。但是如果你把它们弄好,就可以很容易地实现你描述的场景。