mysql如何刪除表中的重複行並保留id較小(或者較大)的記錄
阿新 • • 發佈:2019-01-25
在實際錄入資料庫的過程中,如果資料量比較大的話,難免會因為一些原因,而錄入多條重複的記錄,那麼應該如何操作才能刪除重複行,並且保留一條id較大,或者較小的記錄呢。
在本例中所用資料表結構如下所示tdb_goods
表中資料重複如圖所示
首先第一步,利用group by分組查出每組中數目大於2的(即重複記錄的)內容
mysql> SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING COUN T(goods_name)>=2; +----------+------------------------------+ | goods_id | goods_name | +----------+------------------------------+ | 20 | X3250 M4機架式伺服器 2583i14 | | 19 | 商務雙肩揹包 | +----------+------------------------------+ 2 rows in set (0.01 sec)
然後使用LEFT JOIN使原始表和上述查詢結果進行連線,刪除重複記錄,保留id較小的記錄
mysql> DELETE t1 FROM tdb_goods AS t1 LEFT JOIN( SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING COUNT(goods_name)>=2) AS t2 ON t1.goods_na me = t2.goods_name WHERE t1.goods_id>t2.goods_id; Query OK, 2 rows affected (0.06 sec)
從上述語句可以看出,條件是名稱相同的,然後刪除所有goods_id大的記錄。這樣就可以實現想要的效果。
如果想保留id較大的同理,如下所示
mysql> DELETE t1 FROM tdb_goods AS t1 LEFT JOIN( SELECT max(goods_id) AS goods_i d,goods_name FROM tdb_goods GROUP BY goods_name HAVING COUNT(goods_name)>=2) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id<t2.goods_id; Query OK, 2 rows affected (0.03 sec)
注關於表連線,如有疑問請檢視JOIN的用法。