2011-01-06 46 views
1

我有一個相當大的InnoDB/MySQL關係數據庫。我在任何地方都使用了外鍵約束,加上「ON UPDATE CASCADE」(和「ON DELETE CASCADE」)。在InnoDB/MySQL中使用外鍵約束和級聯

此數據庫是CRM系統的一部分,因此包含用戶,然後將帳戶附加到這些用戶。

通常,我們發現用戶表中有重複的條目,我們希望合併它們。

一種選擇是編寫遍歷數據庫的腳本,更新所有相關表中的user_id列。但是,每當數據庫結構發生變化時,這無疑會中斷。

我想探索的另一個選擇是使用CASCADE。如果我想合併某甲和某乙,我可以做這樣的事情:

UPDATE user SET id = $A.id$ WHERE id = $B.id$ limit 1 

那麼這種變化應該通過所有依賴於用戶表的表中傳播。

然後,我不得不刪除重複的行之一的用戶:

DELETE FROM user WHERE id = $A.id$ LIMIT 1 

不幸的是兩個問題的辦法。

首先,user.id列是主鍵,因此是唯一的。其次(假設我已經將user.id從PRIMARY KEY轉換爲常規INDEX),如果用戶中存在重複的ID,並且我刪除了一個,則刪除從屬表中的所有行。

有沒有辦法解決這些問題?

+0

這很令人困惑 - 你說'user.id列是主鍵'和'用戶ID重複'。如果id是主鍵,它是唯一的,那麼如何重複? – Mark 2011-01-06 11:17:30

回答

0

合併重複用戶的問題(或重複的任何東西)是我不信任刪除級聯和更新級聯上的東西。首先,您如何知道在發生衝突時要保留哪些數據(例如兩個不同的家庭地址,只允許一個)?重複數據刪除幾乎是最好的方式,從爲此目的而構建的應用程序手動完成,您可以選擇在遇到唯一約束時優先考慮的值。如果您手動執行該操作,則需要決定用於確定優先級的規則(通常是最近更新的記錄,這意味着您必須在記錄上次更新時記錄)。當你這樣做時,你也希望擁有審計表,所以你可以撤銷原來不是一個的「重複」。