我有一种情况,我有几个相关/级联表。让我们说所有1对多的关系级联table1,table2,table3,table4等。我所拥有的是表中的默认行。它们以table1中的1条记录开头,并在其他表中有1条或更多相关记录。
我正在寻找的是一种简单的方法来复制行并为每个行创建/维护新的主键。通过维护我的意思是,table1.ID1被复制,所以现在有一个table1.ID2,其余的列都是相同的,只有ID已经改变。
最重要的是,所有其他表中的所有相关行都被复制,foreigns键/主键都指向新的。
因此table2的table1.ID2的外键是table2.ID#的主键,table2行的其余列与table2中复制的行相同。
我很懒,试图摆脱管理ID并创建一个非常长的存储过程。
我不认为这可以做到,但我希望我错了。提前谢谢。
答案 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)
触发器就是为此而创建的。然而,良好的触发器难以编写并且难以维护。但是如果你把它们弄好,就可以很容易地实现你描述的场景。