2009-06-24 38 views
2

我需要在我們的某個數據庫表中創建一個唯一的列,並且我們希望完全刪除表中的任何重複項。然而,有一個障礙,那就是有一堆依賴於其他表的影響。刪除FK行時可以更改外鍵ID嗎?

例如,假設我們有如下關係:

------------------- ------------------- 
*  Customer * *  Order  * 
------------------- ------------------- 
* ID    * * ID    * 
* Name   * * CustomerID  * 
* Address   * * Item   * 
------------------- ------------------- 

相當明顯的關係存在 - 一個訂單需要客戶ID,這是一個外鍵。所以我們不能刪除客戶並保留訂單數據。

在這個例子中,我完全可以丟失多餘的客戶數據,但爲了以後的參考,我想將訂單中的客戶ID更改爲「已刪除的客戶」的客戶ID。

有沒有什麼方法可以說「刪除這個,如果有外鍵約束,改爲將該CustomerID改爲該ID」? DB是MS SQL 2005.

回答

4

我會說:

第1步:創建重複的ID列表要與相應的ID,以保持一併刪除。 該方法真的取決於你如何檢測重複。假設你得到一個表:

------------- 
* Dupes * 
------------- 
* del_id * 
* keep_id * 
------------- 

第2步:重新鏈接訂單

update order o 
set CustomerID=(select keep_id from Dupes d where d.del_id=o.CustomerID) 
where CustomerID in (select del_id from Dupes) 

第3步:刪除舊客戶

delete from Customer 
where ID in (select del_id from Dupes) 

瞧。

1

AFAIK,它不能在一個SQL語句中完成。

但這聽起來像是CEFERER上BEFORE DELETE觸發器的公平遊戲。

你只需要確保這兩個操作是一個單一的工作單元。

1

可能在客戶表上使用刪除觸發器。 Books online on create trigger.

但是,爲什麼不刪除客戶之前更新訂單記錄?這很容易,避免了觸發器和IMO將邏輯保持在同一個地方。

1

無論如何,你必須有兩個ID:dupCustomerIdnewCustomerId,那麼你爲什麼不先更新參考?

UPDATE Order set CustomerID = newCustomerId WHERE CustomerID = dupCustomerId 

,然後刪除從客戶表中重複:

DELETE from Customer WHERE ID = dupCustomerId 

還是我失去了一些東西?

1

您是否說您有重複的客戶記錄,即客戶的詳細信息是相同的,但是客戶ID不同,因此有訂單引用同一客戶的多個版本?

如果是的話,我會進行數據清理活動

創建/建立一個查找表中的列

  • 客戶ID
  • 的OrderID
  • PrimaryCustomerID - (需要計算)

然後,您可以執行更新訂單表以確保每個訂單僅引用PrimaryCustomerID。

然後,您可以刪除由訂單不再被引用的客戶記錄(即,它們是重複的)。或者,您可以將一個屬性添加到Customer表中以標記記錄而不是刪除(即duplicateFlag或isDeleted)。

希望這是有道理的。

-1

我們已經建立了dedupping工具(你也應該這樣),首先查找那裏有數據衝突(例如兩個不同的業務電話號碼)的地方,並允許做dedupping選擇正確的數據的人。然後該工具將ID更改爲您正在保存的ID,從最底層的子表開始,並逐步處理所有相關的表。一旦刪除的記錄的所有引用都被刪除,它就刪除父記錄。扣除通常是一個複雜的過程,應該仔細設計這個工具來處理需要處理的內容,並允許在添加新的外鍵表時允許對工具進行更改。您可以將它設置爲alawys chosse數據衝突時保存的記錄中的信息,但在沒有手動干預的情況下這樣做通常是一個糟糕的主意。這是因爲你經常需要知道顧客的人的意見。否則,你最終可能會用一個不好的地址替換一個好的地址。這裏首先介紹dup如何到達這裏。客戶A一直是客戶,並有幾個訂單。他去訂購阿克辛,訂單接受者要求提供他的電話號碼或其他可識別的信息以幫助查看他。客戶A最近移動了一個新的電話號碼和地址,因此他沒有找到並創建了一條新記錄。後來它意識到它是一個dup,但自動重複數據刪除過程選擇較早的記錄,因爲它有更多的訂單,因此用當前的新地址和電話取代記錄。客戶再次打電話訂購另一個dup,因爲訂單接收者再次找不到他。這就是爲什麼我強烈認爲推斷必須是部分手動過程。