【发布时间】:2014-01-24 06:39:40
【问题描述】:
我想创建一个可以轻松复制表的多条记录的过程(或 .Net 代码)。每个表都使用代理键作为主键。因此,我可能无法简单地使用“INSERT INTO SELECT”之类的方式复制所需的记录,因为它们可能引用了错误的记录
表 1 客户:“ID”、“姓名”、“地址”、...
表 2 员工:“ID”、“CustomerID”、“FirstName”、“LastName”、...
表 3 项目:“ID”、“CustomerID”、“Name”、“ResponsibleEmployee”、“StartDate”、...
基本上,我希望能够复制一个完整的客户(例如,将 ID 为 1 的客户复制到已创建的 ID 为 2 的新客户)。这意味着我需要复制其他表的每条记录(在此示例中为表“CustomerEmployee”和“Project”),将字段“CustomerID”设置为新 ID 2 并更改引用(在此示例中为列“ ResponsibleCustomerEmployee") 到已复制的一条新记录。
我的问题是我不知道最好的方法是创建可以完全做到这一点的东西。我想出的最好的主意是做一个两步复制过程。首先复制所有表格内容,而不触及引用其他记录的列的值。插入这些记录时,我会编写类似映射表的东西,在旧 ID 值和新 ID 值之间进行映射。在第二步中,我将尝试使用映射表更正引用(意思是“复制的 ID 为 1 的项目引用了 ID 为 2 的 CustomerEmployee,根据映射表复制的 CustomerEmployee 的 ID 为 20,因此复制的项目必须引用这个新的 ID 20 而不是 2")。
我的问题是是否有更简单的方法来实现这个目标?或者我的想法是否有效,或者我错过了什么?我不认为我是第一个遇到此类问题的人,但我无法在互联网上找到合适的解决方案。也许有人知道一个解决方案,甚至是第三方 .NET 组件,它可能会做我想做的事情(数据库在 .NET 应用程序中使用,这意味着它不一定直接在 SQL Server 中。
更新:添加示例!
在执行复制过程之前,表应该如下所示(注意:ID 是一个标识列,以 ID 结尾的所有内容都引用相应的表):
ID | Name | Address
------------------------------------------
1 | "Customer 1" | "Street of Testcity 1"
2 | "Customer 2" | "Another Address"
ID | CustomerID | FirstName | LastName
--------------------------------------
1 | 1 | "John" | "Doe"
2 | 1 | "Max" | "Test"
3 | 2 | "Jane" | "Doe"
ID | CustomerID | Name | ResponsibleEmployeeID | StartDate
----------------------------------------------------------------------
1 | 1 | "Testproject 1" | 2 | 2014-01-01
2 | 1 | "Testproject 2" | 1 | 2014-01-01
现在我想执行一个复制过程(存储过程、.net 代码或任何技巧)并复制 ID 为 1 的客户和所有相关对象(即使用定义的外键引用该客户的所有记录) .流程完成后,表格应如下所示(复制的条目标有 *):
ID | Name | Address
------------------------------------------
1 | "Customer 1" | "Street of Testcity 1"
2 | "Customer 2" | "Another Address"
3 | "Customer 1" | "Street of Testcity 1" *
ID | CustomerID | FirstName | LastName
--------------------------------------
1 | 1 | "John" | "Doe"
2 | 1 | "Max" | "Test"
3 | 2 | "Jane" | "Doe"
4 | 3 | "John" | "Doe" *
5 | 3 | "Max" | "Test" *
ID | CustomerID | Name | ResponsibleEmployeeID | StartDate
----------------------------------------------------------------------
1 | 1 | "Testproject 1" | 2 | 2014-01-01
2 | 1 | "Testproject 2" | 1 | 2014-01-01
3 | 3 | "Testproject 1" | 5 | 2014-01-01 *
4 | 3 | "Testproject 2" | 4 | 2014-01-01 *
我遇到的问题是,我需要一种方法来修复引用的记录,因为引用的 CustomerID 1 现在应该引用 CustomerID 3(员工反之亦然)
提前致谢!
【问题讨论】:
-
如果你想分配一个特定的 id(只有 20 个应该分配给 id 为 2 的记录)你需要这样做,否则如果你希望 id 是最大 id 的增量在您的表格中,您可以通过单个查询来完成...
-
感谢您的评论,但我真的不希望分配特定的 ID。我只希望复制的记录引用其他复制的记录及其新 ID(这意味着在插入复制的记录时会生成 ID)。我添加了一个示例以更好地理解我想要实现的目标,也许现在会更清楚,但无论如何感谢您的尝试!
标签: sql .net sql-server database