2012-11-27 68 views
3

我完全知道這絕不應該發生。永遠。但是,最近我開始在一家沒有最好的數據庫設計或輸入驗證的公司工作,這種情況已經出現。合併具有唯一列的兩個表項(MySQL)

有一張表,我們稱之爲'工作'*。工作有一個主鍵,'ID'。 ID爲1的作業具有與其相關的大量數據;然而,愚蠢的是,有人把這個工作重複爲id 2(到目前爲止,這發生了大約500次)。所有這兩個信息都需要合併爲id 1(或2,沒關係)。

通過外鍵將列鏈接到UPDATE:CASCADE和DELETE:RESTRICT。他們並不都是所謂的jobs_id。

這裏是我唯一的(貌似合理的)選項:

  1. 的變化ID 1的東西我可以保證不使用(2,147,483,647)
  2. 暫時移除外鍵刪除:限制
  3. 刪除ID爲1
  4. 更新ID 2項至2,147,483,647
  5. 的變化ID 2,147,483,647(它與所有其他條目鏈接)ID 2
  6. 恢復刪除:限制

由於沒有代碼的實際執行刪除操作(限制在那裏,就像一個故障安全(有人在DB)直接編輯),並且更新:級聯留在,數據不應該不同步。雖然這看起來很亂。

這將被包裹在一個事務中。

我可以寫一些東西來遍歷每個表(〜180)和每列以找到某些名稱/條件,然後從1更新到2,但是當新的表/列出現時需要維護。由於這種情況已經發生了很多,而且我沒有看到重寫以防止它很快發生,所以'解決方案'(貼膏藥)需要是半自動的。

  • 不是表的真名。他(或她)的身份已被僞裝,所以他(或她)不會受到欺凌。

欣賞任何輸入。

+0

在我嘗試回答此問題之前,請將以下各項添加到步驟中。 1.做一個完整的備份。 2.在另一臺機器上測試備份,例如恢復到開發環境。 – Namphibian

+0

在生產服務器上執行之前,這總是要在開發環境中進行測試。 – Aeisor

回答

0

假設您知道如何識別重複的記錄,爲什麼不創建具有相同結構(可能沒有FK)的新表,然後在將值複製到新表時循環遍歷原始表。當你點擊一個副本時,在寫入新表格時修改該值。然後放下原件並將溫度重命名爲原件。

這將清理表格,但如果進程仍在複製條目,則可以使用唯一鍵來限制未來的損害。