2008-10-21 69 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;

;-)