2008-10-21 67 views
4

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

客户(idCustomer INT PK,公司VARCHAR(50)等)

CustomerContacts(idCustomerContact INT PK,idCustomer INT FK,名称为varchar(50)等)

CustomerNotes( idCustomerNote int PK,idCustomer int FK,Note Text等)

有时客户需要合并为一个。例如,你有一个ID为1的客户,另一个ID为2的客户。你想合并两个,所以2的所有东西现在都是1.我知道我可以编写一个脚本来更新所有受影响的表格。其中一个,但我想通过使用级联规则使其更具前瞻性,所以我不必在每次添加新关系时更新脚本。

任何想法?

+0

您是否确实意味着合并?看起来你的意思是“替换”。因为您不能在具有相同ID的客户中使用2行。 – mohammedn 2008-10-21 22:50:57

+0

嗯,我想让一位顾客保留他们的身份证,而另一位顾客则假设他的身份证。我想它也可以被称为替代品,我只是在合并的意义上说,两个顾客被合并为一个。 – 2008-10-21 23:51:53

回答

3

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

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

0

请考虑使用触发器。在更新客户(idCustomer列)时,您可以在相关表上进行所需的修改(删除,更新...)。

0

听起来你最终会得到两个记录,每个记录都有相同的主键。这是你的意图吗?

 
     Customers 
    idCustomer Company 
     1  AT&T 
     2  Cingular 

合并将成为

 
     Customers 
    idCustomer Company 
     1  AT&T 
     1  Cingular 

后在任何情况下,最面向未来的解决办法是写一个程序。您可以将这个过程同时传递给客户,并根据需要完成所有表格的更新工作。

0

任何更近期的解决方案?

我有一种相同的问题,并在此刻动态构建程序似乎太复杂。以下是它在理论上的工作原理,但我猜这不是吗?

在一个交易: 1)暂时禁用客户 Cingular公司2)更新主ID主键约束“1”,这有关系级联更新规则带孩子 3)使用辅助键字段的护理删除(仅)的Cingular 4)使能的客户

期待今后T-SQL是这样的主键约束:

删除与UPDATE idCustomer = 1客户WHERE idCustomer = 2;

;-)