我计划从一个表中删除数据,我想知道有多少个表以及哪些表有外键引用 Oracle 中的这个特定表。因为我必须将外键设置为空。我想知道与该特定表有 FK 的所有表的列表。
最佳答案
SELECT
FK.OWNER||'.'||FK.TABLE_NAME AS CHILD_TABLE,
SRC.OWNER||'.'||SRC.TABLE_NAME AS PARENT_TABLE,
FK.CONSTRAINT_NAME AS FK_CONSTRAINT,
SRC.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT
FROM ALL_CONSTRAINTS FK
JOIN ALL_CONSTRAINTS SRC ON FK.R_CONSTRAINT_NAME = SRC.CONSTRAINT_NAME
WHERE
FK.CONSTRAINT_TYPE = 'R'
AND SRC.OWNER = 'MY_SCHEMA'
AND SRC.TABLE_NAME = 'MY_TABLE';
我遇到的情况是,我感兴趣的表不属于我连接的模式。所以我需要修改currently accepted answer中的查询使用ALL_CONSTRAINTS
而不是USER_CONSTRAINTS
。在这个过程中,我犯了一个错误,我发现接受的答案很难阅读,所以我可以修复它。 (缺乏解释并没有帮助。)结果,我最终提出了自己的查询。基本上是一样的,但是我觉得这样更容易理解一些。
FK.CONSTRAINT_TYPE = 'R'
向下过滤FK
到一组外键约束,并且连接将这些外键与其“引用的约束”配对。 (引用的约束通常是“父”表的主键。)最后,我们使用 SRC.OWNER = 'MY_SCHEMA' AND SRC.TABLE_NAME = 'MY_TABLE'
过滤到我们感兴趣的父表。 .
当然,您可以将其切换为使用 USER_CONSTRAINTS
如果你希望;只需删除 SRC.OWNER
检查和 OWNER
SELECT
中的前缀.
关于oracle - Oracle中如何查找具有外键的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3751932/