5

有没有办法将两个主键合并为一个,然后级联更新所有受影响的关系?这是场景:

客户(idCustomer int PK、Company varchar(50) 等)

CustomerContacts(idCustomerContact int PK、idCustomer int FK、Name varchar(50) 等)

CustomerNotes(idCustomerNote int PK、idCustomer int FK、注释文本等)

有时客户需要合并为一个。例如,您有一个 id 为 1 的客户和另一个 id 为 2 的客户。您想要合并两者,以便所有 2 的内容现在都为 1。我知道我可以编写一个脚本来更新所有受影响的表一,但我想通过使用级联规则使其更具未来性,因此我不必每次添加新关系时都更新脚本。

有任何想法吗?

4

4 回答 4

3

没有自动的方法可以做到这一点,但是您有几个选择,您可以手动编写过程,或者您可以定期生成合并代码或在运行时动态生成它。为此,您可以使用INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTSandINFORMATION_SCHEMA.KEY_COLUMN_USAGEINFORMATION_SCHEMA.TABLE_CONSTRAINTSandINFORMATION_SCHEMA.COLUMNS and INFORMATION_SCHEMA.TABLES动态构建过程。

您也可以简单地将整个操作包装在事务中(无论如何都是个好主意)。最后一步是删除要合并的客户,因此如果您从未添加过的表上有 RI,并且您尝试进行合并,它将失败,因为您无法删除要合并的客户,因为存在依赖项尚未添加到合并过程的表中的记录。

于 2008-10-22T00:46:37.260 回答
0

考虑改用触发器。在更新客户(idCustomer 列)时,您可以对相关表进行任何需要的修改(删除、更新...)。

于 2008-10-21T22:58:25.730 回答
0

听起来您最终会为每个具有相同主键的表得到两条记录。这是你的意图吗?

        顾客
    id客户公司
         1 美国电话电报公司
         2 辛格勒

合并后会变成

        顾客
    id客户公司
         1 美国电话电报公司
         1 辛格勒

无论如何,最面向未来的解决方案是编写一个程序。您可以通过两个客户的过程,它会根据需要完成所有更新所有表的工作。

于 2008-10-22T02:52:24.683 回答
0

对此有任何更新的解决方案吗?

我有同样的问题,目前动态构建程序似乎太复杂了。以下是它在理论上如何工作,但我想它不是?

在一个事务中:1) 暂时禁用对客户的主键约束 2) 将 Cingular 的主 ID 更新为“1”,该 ID 具有照顾孩子的关系更新级联规则 3) 使用辅助键字段删除(仅)Cingular 4 ) 对客户启用主键约束

期待在未来的 T-SQL 中出现这样的事情:

更新 idCustomer = 1 从客户中删除,其中 idCustomer = 2;

;-)

于 2010-05-13T06:07:20.850 回答