2011-06-26 78 views
1

一直在摸索我的頭,希望你們中的一位友好的人,並指導我解決這個問題。使用MySQL觸發器在發現重複密鑰時更新另一個表

我有一個客戶的mysql表,它包含了大量的數據,但爲了這個問題的目的,我們只需要擔心4列'ID','名字','姓','郵編'

問題是,表中包含很多重複的客戶。

正在創建一個新的表,其中每個客戶都是獨一無二的,對我們來說,我們決定一個獨特的客戶是基於「名字」,「姓氏」和「郵政編碼」

但是,(這是最重要的位),我們需要確保每個新的「唯一」客戶記錄也可以與原始表格中該客戶的原始多個條目相匹配。

我相信做到這一點的最好方法是擁有第三個表格,它具有'NewUniqueID','OldCustomerID'。因此,我們可以在此表中搜索'NewUniqueID'='123',並在適當的位置返回多個'OldCustomerID'值。

我希望能夠使用觸發器和重複鍵語法來完成這項工作。所以會發生什麼如下:

  1. 查詢運行舊客戶表並將其插入到新的唯一表中。 (一個標準的插入選擇查詢)

  2. 重複的鍵繼續添加記錄,但在第三個表中添加一個條目,註明'NewUniqueID'與我們試圖插入的記錄的'OldCustomerID'同時播放。

希望這是有道理的,如果不清楚我的道歉。 我歡迎並欣賞這一個任何想法! 非常感謝 傑森

回答

1

因爲每一個老客戶正好有一個新客戶(而不是周圍的其他方式),「正確」的設計將增加一個新列的舊錶,說new_customer_id

alter table old_customer add new_customer_id int; 

你創建新的客戶記錄後:

insert into new_customer (first_name, last_name, postcode) 
select distinct first_name, last_name, postcode 
from old_customer; 

然後,你可以填充像這樣的新列:

update old_customer oc set 
new_customer_id = (
    select id 
    from new_customer 
    where first_name = oc.first_name 
    and last_name = oc.last_name 
    and postcode = oc.postcode); 

或者,您可以選擇不使用垃圾數據的舊記錄 - 這些將具有new_customer_id = null;

+0

Bhoemian,這是完美的!感謝你的協助。問候。 JT – Jason

相關問題