查找所有使用公共列的表的列表

Posted

技术标签:

【中文标题】查找所有使用公共列的表的列表【英文标题】: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..我同意你的评论..但是表格已经像这样维护了,我们不应该编辑这些.. 【参考方案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 作为外键的表..

以上是关于查找所有使用公共列的表的列表的主要内容,如果未能解决你的问题,请参考以下文章

查询以查找面向列的表(append_only 表)和分区表的列表

从 MySQL 中具有不同列的表的多个连接结果中删除重复项

如何在postgresql中查找具有特定列的表

在两个不同的表中创建具有相同列的视图 SQL

SqlSever基础 top 查看一个数据库的表的指定列的前百分之几行

SQL 使用值列表更新一列的所有行