启用约束时使用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