2014-10-28 40 views
0

我有一個需求,我需要找出所有那些有共同列的表。查找所有使用公共列的表的列表


我的要求是類似於下面的例子:
一個學校教師被分配到許多部門的許多任務。每個部門都作爲一個表維護。因此,所有部門表都應該有一個可以指向教師Id的列。但是列的名稱可能會有所不同。例如:DivA-TeacherId,DivB-TeacherId ....,DivN-TeacherId


另外還有一個名爲Teacher的表格,其中包含教師的詳細信息。

表老師 - 列TeacherId(主鍵)

老師搬出學校和新老師代替他,並採取了老教師的相同的角色和責任。 所以在這裏,我們需要更新所有依賴表與新老師。

我們可能有100個表格。所以很難找到所有這些表手動。

是否有查詢,我們可以找到所有依賴此列的表,以便可以使用新的TeacherId更新這些表(請注意,此列的命名可能在所有依賴項中都不相同tables.bs所有這些列名可能有一個共同的子字符串「TeacherId」)

請建議是否有任何查詢可以用來找出解決方案上面的一個。

+0

'依賴',你的意思是所有其他表都有一個外鍵約束,從他們的個人命名列到主'teacherId'列? (爲什麼分部分成100個表格?) – 2014-10-28 10:05:46

+0

爲什麼不使用參照完整性s.t. '...更新級聯「或/和'...關於刪除限制'的公鑰和外鍵,讓Oracle維護數據? – 2014-10-28 10:05:50

+0

如果我沒有錯,在DB中找到所有表中發生的事件(「TeacherId」)列表將成爲你的依賴表。在Oracle中使用系統表。 – knkarthick24 2014-10-28 10:05:56

回答

1

您卡恩使用系統表ALL_TAB_COLUMNS

select * from all_tab_columns 
    where column_name LIKE '%Teacher%' 
+0

謝謝..它有助於找出所有使用此列的表..但它不幫助找出使用TeacherId作爲外鍵的表.. – user1706047 2014-10-28 12:18:52

2

讓我們用一個例子瞭解它。

SQL> SELECT a.owner, 
    2 a.table_name, 
    3 b.owner primary_owner, 
    4 b.table_name primary_table 
    5 FROM user_constraints a, 
    6 user_constraints b 
    7 WHERE a.table_name  = 'EMP' 
    8 AND a.r_constraint_name = b.constraint_name 
    9/

OWNER  TABLE_NAME PRIMARY_OWNER PRIMARY_TABLE 
---------- ---------- --------------- --------------- 
SCOTT  EMP  SCOTT   DEPT 

SQL> 

以上查詢利用了referential integrity。表DEPT參考表EMPcolumn names與表格引用無關。

在你的情況下,用你的表名替換EMP。查詢將列出引用您的表的所有表。

您可以閱讀*_CONSTRAINTS

+0

感謝您的respnse。但不知何故r_constraint_name爲空,因爲我沒有得到任何記錄。 – user1706047 2014-10-28 12:17:37

2
select  uc.constraint_name fk_ref_to_source, 
      ucc1.table_name table_ref_to_source, 
      ucc1.column_name column_ref_to_source, 
      ucc2.table_name source_table, 
      ucc2.column_name source_column 
    FROM user_constraints uc, user_cons_columns ucc1, user_cons_columns ucc2 
    WHERE  uc.constraint_name = ucc1.constraint_name 
      AND uc.r_constraint_name = ucc2.constraint_name 
      AND ucc1.position = ucc2.position -- Correction for multiple column primary keys. 
      AND uc.constraint_type = 'R' 
      AND ucc2.table_name = 'TEACHER' 
ORDER BY ucc1.table_name, uc.constraint_name; 

USER_CONSTRAINTS文件包含有關用戶的限制信息
USER_CONS_COLUMNS包含關於形成

此查詢將產生更新的約束列的信息,請案例:

SELECT  'update ' || ucc1.table_name || ' set ' || ucc1.column_name || ' = newTeacherId ' || ' where ' || ucc1.column_name || ' oldTeacherId;' sql 
    FROM user_constraints uc, user_cons_columns ucc1, user_cons_columns ucc2 
    WHERE  uc.constraint_name = ucc1.constraint_name 
      AND uc.r_constraint_name = ucc2.constraint_name 
      AND ucc1.position = ucc2.position -- Correction for multiple column primary keys. 
      AND uc.constraint_type = 'R' 
      AND ucc2.table_name = 'TEACHER' 
      AND ucc2.column_name = 'TEACHERID'; 
+0

感謝您的回覆。但不知何故r_constraint_name爲空,因爲我沒有得到任何記錄。 – user1706047 2014-10-28 12:17:00

+0

@ user1706047這真的很奇怪,因爲FOREIGN KEYS應該有這個列。此查詢應返回0:「user_constraints中的select count(*),其中constraint_type ='R'且r_constraint_name爲null;」 – Multisync 2014-10-28 12:38:59

相關問題