MySQL 查詢重複數據,刪除重複數據保留id最小的一條做爲惟一數據

開發背景:

  最近在作一個批量數據導入到MySQL數據庫的功能,從批量導入就能夠知道,這樣的數據在插入數據庫以前是不會進行重複判斷的,所以只有在所有數據導入進去之後在執行一條語句進行刪除,保證數據惟一性。數據庫

實戰:

表結構以下圖所示:

代表:brandspa

 

操做:

使用SQL語句查詢重複的數據有哪些:

SELECT * from brand WHERE brandName IN(
select brandName from brand GROUP BY brandName HAVING COUNT(brandName)>1 #條件是數量大於1的重複數據
)

使用SQL刪除多餘的重複數據,並保留Id最小的一條惟一數據:

注意點:

錯誤SQL:DELETE FROM brand WHERE brandName IN (select brandName from brand GROUP BY brandName HAVING COUNT(brandName)>1) 
AND Id NOT IN (select MIN(Id) from brand GROUP BY brandName HAVING COUNT(brandName)>1)

 

提示: You can't specify target table 'brand' for update in FROM clause   不能爲FROM子句中的更新指定目標表「brand」code

緣由是:不能將直接查處來的數據當作刪除數據的條件,咱們應該先把查出來的數據新建一個臨時表,而後再把臨時表做爲條件進行刪除功能blog

正確SQL寫法:

 DELETE FROM brand WHERE brandName IN (SELECT brandName FROM (SELECT brandName FROM brand GROUP BY brandName HAVING COUNT(brandName)>1) e)
AND Id NOT IN (SELECT Id FROM (SELECT MIN(Id) AS Id FROM brand GROUP BY brandName HAVING COUNT(brandName)>1) t)
#查詢顯示重複的數據都是顯示最前面的幾條,所以不須要查詢是否最小值

更加簡單快捷的方式:

這是老飛飛的前輩給了一個更加方便,簡潔的寫法(很是感謝大佬的方法):ci

DELETE FROM brand WHERE Id NOT IN (SELECT Id FROM (SELECT MIN(Id) AS Id FROM brand GROUP BY brandName) t)

這句的意思其實就是,經過分組統計出數據庫中不重複的最小數據id編號,讓後經過 not in 去刪除其餘重複多餘的數據。資源

結果以下圖:

總結:

         不少東西都是須要本身一步一步的去探究的,固然網上的建議也是很是寶貴的借鑑和資源,不管作什麼開發咱們都須要理解它的工做原理纔可以更好的掌握它。開發

相關文章
相關標籤/搜索