2012-05-28 64 views
9

我有一些連接到多個網絡/ VLans(A,B & C)的網絡設備,以及剛剛連接到其中一個網絡的其他設備。當我刪除或替換一個網絡時,我需要更新我的數據庫以反映設備所連接的內容,所以我正在嘗試寫一個mysql語句來完成這個任務,但我遇到了各種各樣的障礙。是否可以通過使用「刪除」語句來合併兩條記錄?

我的表只有兩個字段,不能有重複的記錄。我的數據的例子是

deviceID network 
1  A 
1  B 
1  C 
2  B 
2  C 
3  A 
4  A 
5  B 

如何合併網絡A到網絡B所以上表會是什麼樣子......

deviceID network 
1  B 
1  C 
2  B 
2  C 
3  B 
4  B 
5  B 

我最初的嘗試是剛剛set network = 'B' where network = 'A',隨後DELETE network 'A'聲明但是這會產生重複,這是不允許的表 - 即使重複是簡短的。使用替代方法,我通過使用WHERE EXISTS和各種FROM (SELECT)語句繼續運行失敗的mysql語句。是否有可能在單個mysql語句中執行?我需要兩個嗎?

任何幫助表示讚賞。

回答

10

你可以使用UPDATE IGNORE你update語句 - 這將跳過導致重複任何更新。然後,您將使用DELETE跟隨此操作來清除已跳過的行。例如:

UPDATE IGNORE mytable SET network = 'B' WHERE network = 'A'; 
DELETE FROM mytable WHERE network = 'A'; 

documentation

隨着IGNORE關鍵字,更新語句不能使用,即使在更新期間出現 錯誤中斷。不會更新發生重複鍵衝突 的行。將列更新爲值 會導致數據轉換錯誤的行更新爲最接近的 有效值。

+0

這工作完美,謝謝! – JonDoeCA

5

不是有兩個欄目,您可以考慮讓三列作爲
(唯一鍵保持不變)

  • 設備ID
  • 網絡
  • 狀態(1,0)

所以,無論何時一個設備已被刪除/替換,
然後您將狀態標記爲0,
當然,以檢索正確的上市,status=1需要

+0

我玩弄了使用這種方法,我過去也使用過它,但是我希望這次避免使用它。我不想在其他頁面/代碼中進行修改,以適應處理新表結構的新方法。感謝您的迴應! – JonDoeCA

相關問題