启用约束时使用exceptions表来跟踪不符合约束的数据并修正
使用 EXCEPTIONS 表
1. 创建 EXCEPTIONS 表 (utlexcpt.sql)
2. 使用 EXCEPTIONS 子句执行 ALTER TABLE
3. 使用 EXCEPTIONS 子查询查找包含无效数据的行
4. 纠正错误
5. 再次执行 ALTER TABLE 以启用约束
如何识别行违反
EXCEPTIONS 子句帮助识别任何违反已启用的约束的行按下列步骤检测违反
约束的行为纠正它们并重新启用约束
1 如果还未创建请在管理目录中运行 utlexcpt.sql 脚本以创建异常表
SQL> @?/rdbms/admin/utlexcpt Statement processed. SQL> DESCRIBE exceptions Name Null?Type -------------------------- ------- ---------------- ROW_ID UNDEFINED OWNER VARCHAR2(30) TABLE_NAME VARCHAR2(30) CONSTRAINT VARCHAR2(30)
在 Windows NT 中该脚本位于
%ORACLE_HOME%\RDBMS\ADMIN 目录下
2 使用 EXCEPTIONS 子句执行 ALTER TABLE 命令
SQL> ALTER TABLE summit.employee 2 ENABLE VALIDATE CONSTRAINT employee_dept_id_fk 3 EXCEPTIONS INTO system.exceptions; ALTER TABLE summit.employee * ORA-02298:cannot enable (summit.EMP_DEPT_FK) - parent keys not found
如果 EXCEPTIONS 表未用所有者姓名限定则它必须属于正改变
的表的所有者
将行插入 EXCEPTIONS 表中如果重新运行该命令将截断
EXCEPTIONS 表以删除全部现有的行
3 使用 EXCEPTIONS 表上的子查询标识无效数据
SQL> SELECT rowid, id, last_name, dept_id 2 FROM summit.employee 3 WHERE ROWID in (SELECT row_id 4 FROM exceptions) 5 FOR UPDATE; ROWID ID LAST_NAME DEPT_ID ------------------- ----- --------------- -------- AAAAeyAADAAAAA1AAA 1003 Pirie 50 1 row selected.
4 更正数据中的错误
SQL> UPDATE summit.employee 2 SET id=10 3 WHERE rowid='AAAAeyAADAAAAA1AAA'; 1 row processed. SQL> COMMIT; Statement processed.
5 截断 EXCEPTIONS 表并重新启用约束
SQL> TRUNCATE TABLE exceptions; Statement processed. SQL> ALTER TABLE summit.employee 2 ENABLE VALIDATE CONSTRAINT employee_dept_id_fk 3 EXCEPTIONS INTO system.exceptions; Statement processed