oracle中查詢全部外鍵引用到某張表的記錄

其實查找這篇文章  我主要用的sql 是這句  select * from user_cons_columns t where t.constraint_name like 'FK_CTS_CONT_REINS__CRR';  sql

原由: 數據庫

       系統測試的時候發現若是某條記錄已經被引用了,這個時候刪除這條記錄會引發數據不一致,系統會報錯。好比警員信息,在考勤記錄表裏會引用警員ID,若是考勤記錄表中已經存在這個警員ID了,這時從警員表中刪除該警員,就會引發數據不一致,前臺報錯。因此,這個時候我就想查找數據庫中全部引用這個ID的表 測試

 

一:約束類型簡介 優化

約束用於確保數據庫數據知足特定的商業邏輯或者企業規則,若是定義了約束,而且數據不符 對象

合約束,那麼DML操做(INSERT、UPDATE、DELETE)將不能成功執行。約束包括NOT NULL、UNIQUE、PRIMARY KEY、FOREING KEY 以及CHECK等五種類型 開發

NOT NULL約束: table

NOT NULL 約束強制列不接受 NULL 值。 擴展

UNIQUE約束: select

UNIQUE 約束惟一標識數據庫表中的每條記錄。 權限

PRIMARY KEY 約束:

PRIMARY KEY 約束惟一標識數據庫表中的每條記錄。主鍵必須包含惟一的值。

每一個表應該都一個主鍵,而且每一個表只能有一個主鍵。主鍵列不能包含 NULL 值。

FOREING KEY約束:

外部鍵列的數據必須在主表的主鍵列(或唯一列)中存在,或者爲NULL,

CHECK約束:

CHECK 約束用於限制列中的值的範圍。

若是對單個列定義 CHECK 約束,那麼該列只容許特定的值。

若是對一個表定義 CHECK 約束,那麼此約束會在特定的列中對值進行限制。

 

二:Oracle數據字典中查看約束信息

一、咱們建立的對象能夠從"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語句優化敏感。

二、數據字典視圖:概要

在數據字典視圖中有一些隱含的關係。發現這些關係經常是使用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表中

三、約束視圖

有兩個數據字典視圖提供了約束的詳細信息。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=''—此處輸入剛纔查詢出來的表主鍵的約束名

相關文章
相關標籤/搜索