維護項目時遇到一些問題,某張表中幾乎每一條記錄都有一個重複記錄,而它們的id和創建時間又不同,原因大概是SQL執行時間過長,一次請求完不成,這期間再進來一個請求,下面的相關操作會插入重複記錄。現在需要找出這些重複記錄並刪除,再想辦法解決插入重複的問題。
那麼,如何刪除單表中的重複記錄呢?並且條件是部分字段的值一樣才認爲是重複記錄。
我創建了一個簡單的表,來作爲例子。
該表中,我們認爲name,age,sex一致爲一條重複的記錄,應當找出來刪除掉。舉個例子,id爲1和id爲2的是一條重複記錄,而id爲3的那條記錄並不算重複記錄。表中用other字段表示該表中的其他字段信息,但它並不是構成重複的條件之一。
我們可以使用查詢:
SELECT * FROM repay r
GROUP BY r.name,
r.age,
r.sex
HAVING COUNT(*)>1
我們可以得到如上的查詢結果,取得了該表的重複記錄,想要刪除,如果直接執行以下代碼:
DELETE
FROM
repay
WHERE id IN
(SELECT
id
FROM
repay r
GROUP BY r.name,
r.age,
r.sex
HAVING COUNT(*) > 1)
就會報錯。錯誤代碼: 1093 You can't specify target table 'repay' for update in FROM clause。意思就是在同一個語句中,你不能先select出表中某些值再執行更新操作!所以需要加一箇中間表
DELETE
FROM
repay
WHERE id IN
(SELECT
t.id
FROM
(SELECT
*
FROM
repay r
GROUP BY r.name,
r.age,
r.sex
HAVING COUNT(*) > 1) AS t)
執行完後,可以看到表中已經將重複記錄刪除。(注意,我定義的重複是指name,age,sex都一致才認爲是重複。)