嘗試建立唯一索引時遇到 ORA-01452: 找到重複關鍵字,必須先清理重複資料。以下以 code_ref 表為例示範三種方法。
Oracle 每列擁有唯一 ROWID,配合 MAX/MIN 可快速定位重複行。
SELECT a.rowid, a.*
FROM code_ref a
WHERE a.rowid > (
SELECT MIN(b.rowid)
FROM code_ref b
WHERE a.col1 = b.col1
AND a.col2 = b.col2
);
保留 MIN(rowid) 的行,其餘為重複。
按唯一索引欄位分組,統計筆數 > 1 即為重複。
SELECT col1, col2, COUNT(*)
FROM code_ref
GROUP BY col1, col2
HAVING COUNT(*) > 1;
刪除時可結合 IN 子查詢或建立暫存表提升效能。
@$ORACLE_HOME/rdbms/admin/utlexcpt.sql 建立 EXCEPTIONS 表(NT 路徑 ORACLE_HOME\Ora81\rdbms\admin,Unix 為 $ORACLE_HOME/rdbms/admin)。ALTER TABLE code_ref ADD CONSTRAINT uq_code_ref UNIQUE (col1, col2)
EXCEPTIONS INTO exceptions;
SELECT c.*
FROM code_ref c, exceptions e
WHERE c.rowid = e.row_id
AND e.constraint = 'UQ_CODE_REF';
MAX(rowid) 保留策略。