special_id + curl 雙欄去重SELECT `id`
FROM `v95_special_content`
GROUP BY `specialid`, `curl`
HAVING COUNT(`curl`) > 1;
邏輯:分組後每組保留第一行(MySQL 非 ONLY_FULL_GROUP_BY 模式下),HAVING COUNT > 1 篩選出有重複的組,取出其 id 批量刪除。
DELETE FROM `v95_special_content`
WHERE `id` IN (上述子查詢);
ORDER BY id LIMIT 1 子查詢)。SELECT DISTINCT `name` FROM `t`;
結果僅返回去重後的欄位值,無法直接獲取對應的主鍵 ID。
SELECT MIN(`id`) AS `keep_id`, `name`
FROM `t`
GROUP BY `name`;
再用 keep_id 反向刪除其餘行:
DELETE FROM `t`
WHERE `id` NOT IN (SELECT `keep_id` FROM (上述查詢) AS tmp);
INSERT IGNORE / REPLACE INTO 重建表CREATE TABLE `t_new` LIKE `t`;
ALTER TABLE `t_new` ADD UNIQUE INDEX `uk_name` (`name`);
INSERT IGNORE INTO `t_new` SELECT * FROM `t`;
RENAME TABLE `t` TO `t_old`, `t_new` TO `t`;
IGNORE 保留首行,REPLACE 保留最後行)。| 方法 | 耗時 | 鎖表 | 適用場景 |
|---|---|---|---|
| GROUP BY + HAVING + DELETE | ~30s | 行鎖 | 需保留特定行、重複率低 |
| DISTINCT 子查詢 DELETE | ~25s | 行鎖 | 單欄去重、保留首行 |
| 新建表 + UNIQUE + INSERT IGNORE | ~8s | 表鎖(刪舊表時) | 重複率高、一次性清理 |
UNIQUE INDEX,源頭攔截重複寫入。GROUP BY 精確控制;大表用「新建表+唯一索引」法。SELECT DISTINCT 或 GROUP BY 直接返回去重結果。