啟用約束時使用exceptions表來跟蹤不符合約束的資料並修正
啟用約束時使用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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-717673/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Javaweb-約束-外來鍵約束JavaWeb
- Oracle定義約束 外來鍵約束Oracle
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 生成指令碼,得到所有表的外來鍵約束,然後刪除並重建這些約束指令碼
- 資料庫常用約束資料庫
- SQL Server 資料表程式碼建立約束SQLServer
- 資料完整性約束:主鍵、外來鍵、各種約束的建立刪除語句
- SQL約束SQL
- Oracle約束Oracle
- oracle 約束Oracle
- MySQL 約束MySql
- 03約束
- 綜合約束
- Oracle約束enable validate時資料檢查Oracle
- (10)邏輯綜合新增約束(環境約束)
- MySQL——表的約束,資料型別,增刪查改MySql資料型別
- mysql啟動和關閉外來鍵約束MySql
- Oracle資料庫開發——表(資料完整性約束)Oracle資料庫
- oracle中的約束Oracle
- oracle 約束的novalidate 應用Oracle
- 約束介紹
- 差分約束
- 5_MySQL 表的欄位約束MySql
- oracle外來鍵約束的總結Oracle
- SQL Server唯一約束的使用SQLServer
- [求助][資料庫]表間約束的刪除完整性?資料庫
- PostgreSQL唯一約束如何使用?SQL
- mysql資料庫匯入外來鍵約束問題MySql資料庫
- mysql~資料完整性考慮~外來鍵約束MySql
- 為什麼在資料倉儲中很少使用主外來鍵約束
- 解決資料庫的索引亂碼問題,先刪除外來鍵約束,再刪除主鍵約束及其索引資料庫索引
- C# 泛型 引用型別約束 值型別約束C#泛型型別
- 泛型的約束理解泛型
- REST 的 6 個約束REST
- oracle的延遲約束Oracle
- SQLite語句(一):表的操作和約束SQLite
- SQL的主鍵和外來鍵約束SQL
- SQLServer約束介紹SQLServer