Oracle
在Oracle DB中查詢不滿足表中約束的數據
在 Oracle 中,我在給定模式中有很多表。架構中的某些表約束已被禁用。
我必須知道給定模式中的所有表,其中任何約束都已停用,哪些(數據)行不能滿足停用的約束。
問題
如果我決定再次啟用約束,有沒有辦法輕鬆收集所有會產生錯誤的行?
到目前為止,我會嘗試逐個約束,為每個表創建一個查詢並執行該查詢。但我想知道是否有任何東西可以快速完成工作並且不易出錯。如果可能,解決方案應使用視圖中可用的資訊
USER_CONSTRAINTS
或任何類似資訊。我已經檢查了
constraint
Oracle 中的文件,其中該constraint
子句可能使用ENABLE NOVALIDATE
,它允許在修改現有值之前擁有不合規的數據行。但是,我正在尋找一種解決方案,允許我在重新啟用約束之前修復數據。
在啟用約束之前,您必須創建一個適當的異常報告表以接受來自 ENABLE 子句的 EXCEPTIONS 選項的資訊。您可以通過執行 UTLEXCPT.SQL 腳本或 UTLEXPT1.SQL 腳本來創建異常表。
以下語句嘗試驗證 dept 表的 PRIMARY KEY,如果存在異常,則將資訊插入到名為 EXCEPTIONS 的表中:
ALTER TABLE dept ENABLE PRIMARY KEY EXCEPTIONS INTO EXCEPTIONS;
如果 dept 表中存在重複的主鍵值,並且 dept 上的 PRIMARY KEY 約束的名稱是 sys_c00610,則以下查詢將顯示這些異常:
SELECT * FROM EXCEPTIONS;
顯示以下異常:
fROWID OWNER TABLE_NAME CONSTRAINT ------------------ --------- -------------- ----------- AAAAZ9AABAAABvqAAB SCOTT DEPT SYS_C00610 AAAAZ9AABAAABvqAAG SCOTT DEPT SYS_C00610