我們有一個表business_users
,其中有一個user_id
和business_id
,我們有重複項。 我該如何編寫一個查詢來刪除除一個以外的所有重複項?刪除除一個以外的所有副本
3
A
回答
9
完全相同行
如果你想完全避免相同的行,我明白你的問題在第一,那麼你可以選擇唯一行到一個單獨的表,並重新創建該表的數據。
CREATE TEMPORARY TABLE tmp SELECT DISTINCT * FROM business_users;
DELETE FROM business_users;
INSERT INTO business_users SELECT * FROM tmp;
DROP TABLE tmp;
要小心,如果有引用此表的任何外鍵約束,但是,作爲行臨時刪除可能導致級聯刪除別處。
引入的唯一約束
如果你只關心對user_id
和business_id
,你可能想避免在未來引入重複。您可以將現有數據移動到臨時表中,添加約束,然後將表格數據移回,忽略重複項。
CREATE TEMPORARY TABLE tmp SELECT * FROM business_users;
DELETE FROM business_users;
ALTER TABLE business_users ADD UNIQUE (user_id, business_id);
INSERT IGNORE INTO business_users SELECT * FROM tmp;
DROP TABLE tmp;
以上回答基於this answer。關於外鍵的警告就像它在上面的部分中一樣。
一次性去除
如果你只是想執行一個查詢,不以任何方式修改表結構,和你有一個主鍵id
識別每一行,那麼你可以嘗試以下方法:
DELETE FROM business_users WHERE id NOT IN
(SELECT MIN(id) FROM business_users GROUP BY user_id, business_id);
this answer先前提出了類似的想法。
如果上述請求失敗,因爲你不能閱讀,並在同一步驟從表中刪除,您可以再次使用臨時表:
CREATE TEMPORARY TABLE tmp
SELECT MIN(id) id FROM business_users GROUP BY user_id, business_id;
DELETE FROM business_users WHERE id NOT IN (SELECT id FROM tmp);
DROP TABLE tmp;
如果你想,你仍然可以在以這種方式清理數據之後引入唯一性約束。爲此,請執行上一節中的ALTER TABLE
行。
3
既然你有一個主鍵,你可以用它來挑去相關的行:
delete from business_users
where id not in (
select id from (
select min(id) as id -- Make a list of the primary keys to keep
from business_users
group by user_id, business_id -- Group by your duplicated row definition
) as a -- Derived table to force an implicit temp table
);
這樣一來,你就不會需要創建/刪除臨時表等(除implicit one )。
您可能想對user_id, business_id
設置一個唯一約束,因此您不必再擔心這一點。
相關問題
- 1. 刪除陣列中除1個以外的所有副本 - JavaScript
- 2. 刪除SKSpriteNode的所有副本
- 3. 查找除一個以外的所有div id並刪除類
- 4. NSIS - 刪除除一個文件以外的所有文件
- 5. 刪除除一個重複記錄以外的所有記錄
- 6. 從StackPanel中刪除除第一個以外的所有項目?
- 7. 刪除除第一個以外的所有活動
- 8. Prolog刪除所有變量和副本
- 9. Windows Cmd行刪除命令刪除除一個以外的所有文件
- 10. Рhppreg_replace - 刪除除html標記以外的所有文本IMG
- 11. 刪除除格式以外的所有格式文本?
- 12. 刪除除一些特殊字符以外的所有字符
- 13. 刪除除VIM中第一列以外的所有內容
- 14. 刪除除最新10個以外的所有目錄
- 15. 刪除除4個最新目錄以外的所有文件
- 16. Shell - 刪除除單個文件夾以外的所有內容
- 17. TCL刪除所有以一個字符
- 18. 刪除除「XYZ」外的所有行
- 19. 刪除除PHP第一個之外的所有列表元素?
- 20. SQLite如何刪除除一個之外的所有重複行?
- 21. 在MySql中刪除除了一個之外的所有表格
- 22. 刪除除了一個之外的所有註釋引腳
- 23. 刪除除一個之外的所有SMTP地址
- 24. Python刪除除一個之外的所有子元素
- 25. 刪除每個人的除最後一項以外的所有內容
- 26. 刪除NSString中除一個字符以外的所有字符的實例
- 27. 刪除CPP中的副本
- 28. 刪除除一個目錄以外的所有文件和目錄
- 29. 從句子中刪除除第一個單詞以外的所有單詞
- 30. 刪除除一個特定字符以外的所有非數字字符
點擊相關的問題。幾個星期前,當我在尋找這個問題時,我發現了一些想法。我混合並匹配了幾個以獲得理想的結果。 – MetalFrog
你在這個表上有任何主鍵或其他唯一約束嗎?或者'user_id'和'business_id'是唯一的列,這樣整個行都會被複制? – ruakh
看起來像http://stackoverflow.com/questions/672702/how-to-delete-duplicates-in-mysql-table的副本?rq = 1 – cptScarlet