【问题标题】:Finding list of all the tables those use a common column查找所有使用公共列的表的列表
【发布时间】:2014-10-28 09:59:15
【问题描述】:

我有一个要求,我需要找出所有具有公共列的表。


我的要求与以下示例类似:
学校教师被分配到许多部门的许多任务。每个分区都维护为一个表。所以所有的分区表都应该有一个可以指向Teacher Id的列。但是列的名称可能不同。例如:DivA-TeacherId、DivB-TeacherId ....、DivN-TeacherId


还有一个名为 Teacher 的表,其中包含教师的详细信息。

表 Teacher - 列 TeacherId(主键)

老师搬出学校,一位新老师接替他,承担与老老师相同的角色和职责。 所以这里我们需要用新教师更新所有的依赖表。

我们可能有 100 张桌子。所以很难手动找出所有这些表。

是否有查询,我们可以找到所有依赖于该列的表,以便使用新的 TeacherId 更新这些表。(请注意,该列的命名在所有依赖表中可能不一样.但是所有这些列名可能有一个共同的子字符串“TeacherId”)

请建议是否可以使用任何查询来找出上述问题的解决方案。

【问题讨论】:

  • “依赖”是指所有其他表都具有从它们单独命名的列到主teacherId 列的外键约束? (为什么分区要分成100张表!?)
  • 为什么不使用参照完整性 s.t. ...on update cascade 或 /and ...on delete restrict 用于主键和外键并让 Oracle 维护数据?
  • 如果我没记错的话,你提到的出现列(“TeacherId”)在数据库中查找所有表将是你的依赖表。在 Oracle 中使用系统表。
  • @Alex..是的,其他表对 TeacherId 有外键约束。仅举个例子,我将其称为部门..
  • @Dmitry..我同意你的评论..但是表格已经像这样维护了,我们不应该编辑这些..

标签: sql database oracle10g


【解决方案1】:

让我们通过一个例子来理解它。

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的文档

【讨论】:

  • 感谢您的回复。但不知何故,r_constraint_name 为 null,因此我没有得到任何记录。
【解决方案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';

【讨论】:

  • 感谢您的回复。但不知何故,r_constraint_name 为 null,因此我没有得到任何记录。
  • @user1706047 真的很奇怪,因为 FOREIGN KEYS 应该有这个栏目。此查询应返回 0:“select count(*) from user_constraints where constraint_type = 'R' and r_constraint_name is null;”
【解决方案3】:

您不能使用系统表 ALL_TAB_COLUMNS

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

【讨论】:

  • 谢谢..它有助于找出所有使用此列的表..但它无助于找出使用 TeacherId 作为外键的表..
猜你喜欢
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多