建立主鍵或唯一索引失敗時,往往是因為候選欄位存在重複值。以下通用查詢能快速定位重複組合與筆數,適用於所有主流關聯式資料庫。
SELECT column1, column2, COUNT(*) AS dup_cnt
FROM tableName
GROUP BY column1, column2
HAVING COUNT(*) > 1
ORDER BY dup_cnt DESC;
column1, column2:欲檢查的複合鍵欄位(單一欄位只寫一個)。COUNT(*):重複筆數。HAVING COUNT(*) > 1:只保留重複群組。ORDER BY dup_cnt DESC:最嚴重重複優先顯示。-- 1. 找出所有重複列的完整資料(含其他欄位)
SELECT t.*
FROM tableName t
JOIN (
SELECT column1, column2
FROM tableName
GROUP BY column1, column2
HAVING COUNT(*) > 1
) dup ON t.column1 = dup.column1 AND t.column2 = dup.column2
ORDER BY t.column1, t.column2;
-- 2. 保留每組第一筆,刪除其餘重複(需配合 ROW_NUMBER)
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY id) AS rn
FROM tableName
)
DELETE FROM tableName WHERE id IN (SELECT id FROM cte WHERE rn > 1);
MySQL、PostgreSQL、SQL Server、Oracle、SQLite 皆支援上述標準 SQL 寫法(ROW_NUMBER 需 8.0+/10g+ 版本)。
WHERE 縮小範圍。收藏此查詢模板,下次遇到「無法建立主鍵」錯誤時,一鍵定位問題根源。