Oracle所有外键引用

17

我继承了一个模式,因此并不完全了解/确信其中的内容。

我有一个带有projectId的项目表。还有许多其他表通过项目id引用此表。我想运行一个查询来确定:

  1. 哪些表具有对项目表的外键引用
  2. 哪些表具有名为project id的列(在没有设置外键的情况下)。

如果是SQL Server,我知道如何查询元数据,但是在Oracle中我该如何做?

6个回答

22

1)

select table_name
  from all_constraints
 where r_constraint_name = [your pk/uk constraint on PROJECTS(id)]

2)

select table_name
  from all_tab_columns
 where column_name = 'PROJECT_ID'

您可能想要添加一个额外的谓词,其中包含OWNER列。

敬礼,Rob。


18

好的,这里是一个请求,它会给你所引用的表和列:

SELECT
 c_list.CONSTRAINT_NAME as NAME,
 substr(c_src.COLUMN_NAME, 1, 20) as SRC_COLUMN,
 c_dest.TABLE_NAME as DEST_TABLE,
 substr(c_dest.COLUMN_NAME, 1, 20) as DEST_COLUMN
FROM ALL_CONSTRAINTS c_list, ALL_CONS_COLUMNS c_src, ALL_CONS_COLUMNS c_dest
WHERE c_list.CONSTRAINT_NAME   = c_src.CONSTRAINT_NAME
 AND  c_list.OWNER             = c_src.OWNER
 AND  c_list.R_CONSTRAINT_NAME = c_dest.CONSTRAINT_NAME
 AND  c_list.OWNER             = c_dest.OWNER
 AND  c_list.CONSTRAINT_TYPE = 'R'
 AND  c_src.OWNER      = '<your-schema-here>'
 AND  c_src.TABLE_NAME = '<your-table-here>'
GROUP BY c_list.CONSTRAINT_NAME, c_src.TABLE_NAME,
    c_src.COLUMN_NAME, c_dest.TABLE_NAME, c_dest.COLUMN_NAME;

这将给你类似于以下内容:

NAME                  |SRC_COLUMN      |DEST_TABLE            | DEST_COLUMN
----------------------|----------------|----------------------|-----------
CFK_RUB_FOR           |FOR_URN         |T03_FORMAT            |FOR_URN
CFK_RUB_RUB           |RUB_RUB_URN     |T01_RUBRIQUE          |RUB_URN
CFK_RUB_SUP           |SUP_URN         |T01_SUPPORT           |SUP_URN
CFK_RUB_PRD           |PRD_URN         |T05_PRODUIT           |PRD_URN

如果结果可用,则可以忘记substr()函数。但这不适用于我的情况。


1

1):SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_NAME='R' and R_CONSTRAINT_NAME='xxx'

其中 xxx 是项目表主键约束的名称

2):SELECT * FROM USER_TAB_COLUMNS WHERE COLUMN_NAME='PROJECT_ID'


1
外键约束潜在跨越模式,因此我不会选择user_constraints。对于user_tab_columns也是如此。 - Rob van Wijk
Rob:这取决于具体情况。在我所在的环境中,user_...已经足够了,而all_tab_columns会给出误导性的结果。 - Erich Kitzmueller
1
ammoQ: 真的,这取决于情况。user_...可能已经足够了。但请注意线程标题:“所有外键引用”... - Rob van Wijk

0
请使用这个查询。
   select b.TABLE_NAME,b.CONSTRAINT_NAME ,a.COLUMN_NAME
   from all_constraints b, all_cons_columns a
   where r_constraint_name = 'Constraint_Name' and  a.CONSTRAINT_NAME=b.CONSTRAINT_NAME;

0

r_constraint_name 的答案对我来说似乎不起作用,不确定为什么,因为我自己也是 Oracle 的新手,但这个方法有效:

SELECT * FROM ALL_CONSTRAINTS WHERE CONSTRAINT_NAME = '<constraint>';

0

我的问题略有不同。我有一个表格,想要编程知道它引用了哪些其他的表格/列。

我从Stan上面的回答开始,但这并没有给我我需要的东西,所以我想出了这个方法,并在这里发布,以防其他人也有我的问题:

WITH src as
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position, ac.r_constraint_name
  FROM ALL_CONSTRAINTS ac, all_cons_columns accs
 WHERE ac.owner = '<owner>'
   AND ac.constraint_type = 'R'
   AND ac.table_name = '<src_table>'
   AND accs.owner = ac.owner
   AND accs.table_name = ac.table_name
   AND accs.constraint_name = ac.constraint_name
ORDER BY ac.table_name, ac.constraint_name, accs.position),
dst as
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position
  FROM ALL_CONSTRAINTS ac, all_cons_columns accs
 WHERE ac.owner = '<owner>'
   AND accs.owner = ac.owner
   AND accs.table_name = ac.table_name
   AND accs.constraint_name = ac.constraint_name
ORDER BY ac.table_name, ac.constraint_name, accs.position)
SELECT src.table_name as src_table,
       dst.table_name as dst_table,
       src.constraint_name as src_constraint,
       src.column_name as src_column,
       dst.column_name as dst_column,
       src.position as position
  FROM src,dst
 WHERE src.r_constraint_name = dst.constraint_name
   AND src.position = dst.position

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接