2014-10-28 92 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