Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并主键-级联更新_Sql_Sql Server_Cascade - Fatal编程技术网

Sql 合并主键-级联更新

Sql 合并主键-级联更新,sql,sql-server,cascade,Sql,Sql Server,Cascade,有没有办法将两个主键合并为一个,然后级联更新所有受影响的关系?以下是场景: 客户(idCustomer int PK、varchar公司(50)等) CustomerContacts(idCustomerContactintPK、idCustomer intFK、Name varchar(50)等) CustomerNotes(idCustomerNote int PK、idCustomer int FK、注释文本等) 有时需要将客户合并为一个。例如,您有一个id为1的客户和另一个id为2的客户

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

客户(idCustomer int PK、varchar公司(50)等)

CustomerContacts(idCustomerContactintPK、idCustomer intFK、Name varchar(50)等)

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

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


有什么想法吗?

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

没有自动执行的方法,但您有两个选项,可以手动编写过程,也可以定期编写代码生成合并,或者在运行时动态生成合并。为此,可以使用
INFORMATION\u SCHEMA.REFERENTIAL\u CONSTRAINTS
INFORMATION\u SCHEMA.KEY\u COLUMN\u USAGE
INFORMATION\u SCHEMA.TABLE\u CONSTRAINTS
INFORMATION\u SCHEMA.TABLES
动态构建过程


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

听起来,对于这些表中的每个表,您都将得到两条具有相同主键的记录。这是你的意图吗

Customers idCustomer Company 1 AT&T 2 Cingular 客户 国际客户公司 1美国电话电报公司 2扣带回 合并后将成为

Customers idCustomer Company 1 AT&T 1 Cingular 客户 国际客户公司 1美国电话电报公司 1扣带回
在任何情况下,最能证明未来的解决方案都是编写一个过程。您可以将该过程传递给两个客户,它将完成所有必要的表更新工作

最近有什么解决办法吗

我也有类似的问题,目前动态构建过程似乎太复杂了。这是理论上它是如何工作的,但我想不是吗

在一次交易中: 1) 对客户临时禁用主键约束 2) 将Cingular的主ID更新为“1”,该ID具有一个关系更新级联规则,用于处理子级 3) 使用辅助键字段删除(仅)Cingular 4) 对客户启用主键约束

期待在未来的T-SQL中出现类似的情况:

从idCustomer=2的客户中删除并更新idCustomer=1


;-)

你真的是说合并吗?你的意思似乎是“替换”。因为举例来说,客户中不能有2行具有相同ID。我希望一个客户保留其ID,而另一个客户则假定该ID。我猜这也可以称为替换,我只是在将两个客户合并为一个客户的意义上使用merge。无论是使用触发器还是级联更新来更新受影响的表,我仍然无法按照问题中所述进行合并。