有没有办法将两个主键合并为一个,然后级联更新所有受影响的关系?这是场景:
客户(idCustomer int PK,公司varchar(50)等)
CustomerContacts(idCustomerContact int PK,idCustomer int FK,Name varchar(50)等)
CustomerNotes(idCustomerNote int PK,idCustomer int FK,Note Text等)
有时客户需要合并为一个。例如,你有一个id为1的客户和另一个id为2的客户。你想要合并两个,所以2的所有内容现在都是1.我知道我可以编写一个脚本来更新所有受影响的表一,但我希望通过使用级联规则使其更具未来性,所以每次添加新关系时我都不必更新脚本。
有什么想法吗?
答案 0 :(得分:3)
没有自动的方法,但您有几个选项,您可以手动编写过程,或者您可以定期生成合并代码或在运行时动态生成它。为此,您可以使用INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
和INFORMATION_SCHEMA.KEY_COLUMN_USAGE
以及INFORMATION_SCHEMA.TABLE_CONSTRAINTS
和INFORMATION_SCHEMA.COLUMNS and INFORMATION_SCHEMA.TABLES
动态构建过程。
您也可以简单地将整个操作包装在一个事务中(无论如何都是个好主意)。最后一步是删除正在合并的客户,所以如果你从未添加的表上有RI,并且你尝试进行合并,它将会失败,因为你无法删除被合并的客户,因为有依赖表中的记录尚未添加到合并过程中。
答案 1 :(得分:0)
请考虑使用触发器。在更新Customers(idCustomer列)时,您可以在相关表上执行任何所需的修改(删除,更新...)。
答案 2 :(得分:0)
听起来你最终会为每个表都有两条记录,这两个表都有相同的主键。这是你的意图吗?
Customers idCustomer Company 1 AT&T 2 Cingular
合并后将成为
Customers idCustomer Company 1 AT&T 1 Cingular
无论如何,最具前瞻性的解决方案是编写程序。您可以将这个过程传递给客户,并且它会根据需要完成更新所有表的所有工作。
答案 3 :(得分:0)
最新的解决方案是什么?
我有同样的问题,目前动态构建程序看起来太复杂了。这是它在理论上如何运作,但我想它不是?
在一次交易中: 1)暂时禁用客户的主键约束 2)将Cingular的主要ID更新为“1”,其具有关系更新级联规则,负责照顾孩子 3)使用辅助键字段删除(仅)Cingular 4)在客户上启用主键约束
在未来的T-SQL中期待这样的事情:
DELETE WITH UPDATE idCustomer = 1 FROM Customers WHERE idCustomer = 2;
- )