嘗試建立唯一索引時遭遇 ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found,必須先識別並清理重複資料。
SELECT a.rowid, a.*
FROM code_ref a, code_ref b
WHERE a.unique_key = b.unique_key
AND a.rowid > b.rowid;
ROWID 唯一性,MAX(ROWID) 或 MIN(ROWID) 保留單一記錄。
DELETE FROM code_ref
WHERE rowid IN (
SELECT a.rowid
FROM code_ref a, code_ref b
WHERE a.unique_key = b.unique_key
AND a.rowid > b.rowid
);
SELECT unique_key, COUNT(*)
FROM code_ref
GROUP BY unique_key
HAVING COUNT(*) > 1;
@?/rdbms/admin/utlexcpt.sql
-- NT: %ORACLE_HOME%\Ora81\rdbms\admin\utlexcpt.sql
-- UNIX: $ORACLE_HOME/rdbms/admin/utlexcpt.sql
ALTER TABLE code_ref ADD CONSTRAINT uk_code_ref UNIQUE (unique_key)
EXCEPTIONS INTO exceptions;
SELECT c.*
FROM code_ref c, exceptions e
WHERE c.rowid = e.row_id
AND e.table_name = 'CODE_REF'
AND e.constraint = 'UK_CODE_REF';
| 維度 | ROWID 自關聯 | GROUP BY HAVING | EXCEPTIONS INTO |
|---|---|---|---|
| 執行效能 | ★★★★★ | ★★★★☆ | ★★★☆☆ |
| 適用資料量 | 大型表 | 中小型表 | 中型表 |
| 直接可刪除 | 是 | 否 (需二次處理) | 是 (經關聯) |
| 直觀度 | 中 | 高 | 低 |
| 約束整合 | 否 | 否 | 是 |