【发布时间】:2010-09-26 04:10:45
【问题描述】:
oracle 9i 中是否有显示表的外键以及这些外键引用的表的命令?
我正在搜索,没有找到任何东西,但我找到了一个与 MySql 一起使用的等效命令,即 SHOW CREATE TABLE
oracle 的 SQL 中是否有等效的命令?
感谢您的回复,但我认为像 MySql 那样做这件事的方法很短。
【问题讨论】:
标签: oracle
oracle 9i 中是否有显示表的外键以及这些外键引用的表的命令?
我正在搜索,没有找到任何东西,但我找到了一个与 MySql 一起使用的等效命令,即 SHOW CREATE TABLE
oracle 的 SQL 中是否有等效的命令?
感谢您的回复,但我认为像 MySql 那样做这件事的方法很短。
【问题讨论】:
标签: oracle
这是另一个答案:dbms_metadata 包有一个函数可以返回表定义的 DDL。
SELECT dbms_metadata.get_ddl('TABLE', '<table>', '<schema>') FROM dual;
这个包显然是从 Oracle 9.2 开始提供的
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96612/d_metada.htm#1656
【讨论】:
您可以首先列出该表的所有约束以及其他表上的任何引用约束:
SELECT
acc.table_name
,acc.column_name
,acc.constraint_name
,ac.r_constraint_name AS referenced_constraint
FROM all_cons_columns acc
INNER JOIN all_constraints ac ON (acc.constraint_name = ac.constraint_name)
WHERE acc.table_name = UPPER('your_table_here');
如果您对约束有合理的命名约定,则应该可以识别哪些是外键,通常使用“FK”前缀/后缀。
【讨论】:
这可以做你想做的事,它使用 Oracle 系统视图。但是,我没有方便的 Oracle 实例来测试它。
SELECT fk.owner, fk.constraint_name, fk.table_name, fc.column_name,
pk.owner, pk.constraint_name, pk.table_name, pc.column_name
FROM all_constraints fk
JOIN all_cons_columns fc ON (fk.owner = fc.owner AND fk.constraint_name = fc.constraint_name)
JOIN (all_constraints pk
JOIN all_cons_columns pc ON (pk.owner = pc.owner AND pk.constraint_name = pc.constraint_name))
ON (fk.r_owner = pk.owner AND fk.r_constraint_name = pk.constraint_name
AND fc.position = pc.position)
WHERE fk.constraint_type = 'R' AND pk.constraint_type IN ('P', 'U')
AND fk.owner = '<schema>' AND fk.table_name = '<table>';
【讨论】:
如果你以后需要外键的DDL,那么这里是提前的答案:)
select
DBMS_METADATA.GET_DEPENDENT_DDL('REF_CONSTRAINT' ,atb.table_name, atb.owner)
from
all_tables atb, all_constraints ac
where
atb.owner = ac.owner and
ac.constraint_type = 'R' and
ac.table_name = atb.table_name and
atb.owner = 'YOURSCHEMA';
【讨论】: