PHP: 移除"同時寫入" MySQL 資料的程式(資料重覆)

規畫 DB 時沒注意到, 有一個欄位是這種狀況: 寫入前檢查是否有此 URL, 有的話, 就不再寫入, 這個現在一看就知道, 該加 UNIQUE KEY, 但是當初規劃時並沒注意到此事(或者是加的時後不能加), 然後自己測, 或者網站量小的時後是都不會有問題的, 但是會出問題的狀況, 會發生在同時寫入的時後, 同時寫入兩筆, 或者寫入第二筆時, 第一筆的資料臨時沒查到(系統太忙 或者 第一筆還沒寫完), 就會有兩筆以上的重覆資料.

這種狀況要把後來寫的那個 ID 拉出來, 砍掉後面的那個 ID(可能會有 2筆以上), 所以下述的程式就是把這些 ID 拉出來, 然後寫成 SQL 檔, 再手動執行砍掉的動作, 砍完後, 再加上 UNIQUE KEY 的屬性.

此程式的做法是假設: 如果同時寫入的, 照理說應該下一筆馬上就會是一樣的, 所以把近兩筆資料值是相同的 ID 拉出來, 然後再砍掉.(目前此案例是可以跑的, 如果流量更大, 同一時間寫入的筆數更多, 或許就得多用幾個 array 來記錄).

duplicates_key.php 的原始碼於: duplicates_key.phps

步驟如下:

  1. mysql -u root DBNAME -e "SELECT id,url FROM TABLE" > sql_select_data.txt
  2. php duplicates_key.php > delete.sql # please check delete.sql
  3. mysql -u root DBNAME < delete.sql
  4. mysql -u root DBNAME < "ALTER TABLE `table_name` ADD UNIQUE ( `colname`) "

當重覆的都砍掉後, 就趕快把 UNIQUE 的 KEY 加好~

但是我在加的時後發現到, MySQL 秀給我這個訊息: ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes, 因為這個欄位是開太大, 這訊息是 varchar(767) 就不能加 UNIQUE 了? 只好另外弄個 hash 來加囉~ 🙂

其它網頁:

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料