查找所有使用公共列的表的列表
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
引用表 EMP
。 column 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 表)和分区表的列表