為了防止重複記錄,常見的方法是在相關表格列上建立唯一索引。然而,最近的一個錯誤導致創建了一個普通索引,從而允許重複項保留在一個包含 2000 萬筆記錄的龐大表中。
問題: 是否會將現有索引修改為唯一或新增這些欄位的新唯一索引會刪除重複記錄,還是會因現有唯一條目而導致操作失敗?
答案:
使用IGNORE 增加唯一索引修飾符將刪除重複記錄:
<code class="sql">ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);</code>
但是,此修飾符在MySQL 5.7. 4 及更高版本中已棄用,導致錯誤。要避免此問題,可以採取以下步驟:
建立一個臨時表來保存原始表中的資料:
<code class="sql">CREATE TABLE tmp_data SELECT * FROM mytable;</code>
截斷原表:
<code class="sql">TRUNCATE TABLE mytable;</code>
在原表上建立唯一索引:
<code class="sql">ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);</code>
將資料複製回原始表中,同時忽略重複行:
<code class="sql">INSERT IGNORE INTO mytable SELECT * from tmp_data;</code>
刪除臨時表:
<code class="sql">DROP TABLE tmp_data;</code>
或者,添加唯一索引如果沒有IGNORE 修飾符將導致查詢失敗並出現錯誤1062(重複鍵)。
以上是**可以透過將現有索引修改為唯一索引或新增索引來刪除重複記錄嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!