起因:
系統測試的時候發現如果某條記錄已經被引用了,這個時候刪除這條記錄會引起數據不一致,系統會報錯。比如警員信息,在考勤記錄表里會引用警員ID,如果考勤記錄表中已經存在這個警員ID了,這時從警員表中刪除該警員,就會引起數據不一致,前台報錯。所以,這個時候我就想查找數據庫中所有引用這個ID的表
一:約束類型簡介
約束用於確保數據庫數據滿足特定的商業邏輯或者企業規則,如果定義了約束,並且數據不符
合約束,那么DML操作(INSERT、UPDATE、DELETE)將不能成功執行。約束包括NOT NULL、UNIQUE、PRIMARY KEY、FOREING KEY 以及CHECK等五種類型
NOT NULL約束:
NOT NULL 約束強制列不接受 NULL 值。
UNIQUE約束:
UNIQUE 約束唯一標識數據庫表中的每條記錄。
PRIMARY KEY 約束:
PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。主鍵必須包含唯一的值。 每個表應該都一個主鍵,並且每個表只能有一個主鍵。主鍵列不能包含 NULL 值。
FOREING KEY約束:
外部鍵列的數據必須在主表的主鍵列(或惟一列)中存在,或者為NULL,
CHECK約束:
CHECK 約束用於限制列中的值的范圍。
如果對單個列定義 CHECK 約束,那么該列只允許特定的值。
如果對一個表定義 CHECK 約束,那么此約束會在特定的列中對值進行限制。
二:Oracle數據字典中查看約束信息
1、我們創建的對象可以從"USER_"開通的視圖中查看。如果在模式中創建了10張表,那么從USER_TABLES中查詢將返回10行,每一行是關於一張表的特性信息 USER_TABLES不能查看非當前用戶模式下創建的表。 ALL_TABLES視圖不但顯示當前用戶模式下創建的表,而且顯示授權能夠訪問的表信息
我們關心的視圖以下列前綴命名: ·USER_ 當前用戶模式下創建的對象 ·ALL_ 當前用戶模式下創建的對象加上當前用戶能訪問的其他用戶創建的對象。ALL視圖常常包含一個"OWNER"列,反映出能夠訪問的對象的所有者。在USER_TABLES表中不能看到OWNER列是因為你就是在這個視圖中所有表的所有者;在ALL_TABLES中有一個OWNER字段。 ·DBA_ 它提供了整個數據庫的信息。包括數據庫中所有表的名字和擁有者——包括SYS模式下的基本表 這些前綴在限制我們想看到的、需要看到的、應當被允許看到的范圍上是一個幫助。查看當前模式下創建的表,查詢USER_TABLES; 查看所有我們創建的表以及被授權可以從其他用戶模式下訪問的表,查詢ALL_TABLES; 具有DBA或SELECT_CATALOG_ROLE角色的用戶可以查詢DBA_TABLES來查詢數據庫中所有表的列表;
不是所有視圖下都有一個USER、ALL、和DBA前綴,有一些視圖僅存在於dba視圖范圍。比如:DBA_DATA_FILES。 在開發環境中有時會訪問DBA視圖,允許開發人員探究Oracle數據字典是沒有害處的。你可以在不擁有DBA角色的情況下獲得這個權限。一般,把CONNECT和RESOURCE角色給應用開發者,他不能訪問這些,你可以把SELECT ANY TABLE權限或SELECT_CATALOG角色賦給一個用戶,這樣他將被允許訪問整個數據字典。 一個人對數據字典理解的越多,越能接觸到數據庫中復雜的操作,越能對SQL語句優化敏感。
2、數據字典視圖:概要 在數據字典視圖中有一些隱含的關系。發現這些關系常常是使用SQL查詢對數據字典驗證的結果,幸運的是,在數據字典中有許多使用名稱的特征。 例如:USER_TABLES表中每一個表包含一個單獨的行。每一行包含一張表的詳細信息,比如表的物理存儲參數。這些數據提供的擴展信息告訴你表是怎么增長的。 USER_TAB_COLUMNS視圖中在USER_TABLES表中的每一張表的每一行包含一條記錄。如果一張表有10個字段,那么,你將在USER_TAB_COLUMNS表中找到10行記錄,是關於每一字段的詳細信息。比如字段數據類型。字段名TABLE_NAME在USER_TABLE 和USER_TAB_COLUMNS表中都有,因此可以很容易的把他們連接起來。
USER_OBJECTS 用戶對象視圖 ALL_OBJECTS 所有對象視圖 DBA_OBJECTS DBA對象視圖
USER_SEQUENCES 用戶序列對象視圖,在USER_SEQUENCES的記錄也會出現在USER_OBJECTS表中
3、約束視圖 有兩個數據字典視圖提供了約束的詳細信息。USER_CONSTRAINTS和USER_CONS_COLUMNS. 一張表可能有也可能沒有約束,對於一張表的每一個約束在USER_CONSTRAINTS中都有一條記錄描述這個約束。包括約束應用到的表名稱。如果你知道約束名想知道約束類型,查詢USER_CONSTRAINTS表。這個視圖描述了約束的定義。它不提供約束定義在哪些字段名稱上。USER_CONSTRAINTS中CONSTRAINT_NAME中表示約束名,如果建立表的時候沒有指定約束名,系統默認的約束名類似“SYS_C006274”這樣的一串字母。R_CONSTRAINT_NAME是外鍵引用表主鍵的約束名。CONSTRAINT_TYPE字段中P:表示主鍵,R:表示外鍵,C表示NOT NULL或CHECK,U表示UNIQUE
在USER_CONS_COLUMNS視圖中顯示約束的字段名稱。如果主鍵是個聯合主鍵,這個視圖中將有這個約束的兩條記錄。聯合主鍵的每一個字段對應一條記錄。每一條記錄通過POSITION(在聯合主鍵中的位置)來區別。可以根據CONSTRAINT_NAME字段將USER_CONSTRAINTS和USER_CONS_COLUMNS關聯起來。
三:得到想要的結果
分為兩步:
//查詢表的主鍵約束名
select * from user_constraints e where e.table_name=’’—-處輸入表名 ,注意表名要大寫
//查詢所有引用到該主鍵的記錄
select b.table_name,b.column_name from user_constraints a
inner join user_cons_columns b
on a.constraint_name = b.constraint_name
where a.r_constraint_name=''—此處輸入剛才查詢出來的表主鍵的約束名