如何检查特定列引用父表

时间:2013-12-18 15:08:06

标签: sql oracle plsql

我有一个子表B,它引用了一些父表{i} A。现在,假设我在表B中有3个coulmns(例如:B1, B2,B3)。我写了一个查询来获取表B中的所有约束,如下所示:

SELECT a.table_name, 
       a.column_name
FROM ALL_CONS_COLUMNS A, ALL_CONSTRAINTS C  
where A.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
  and a.table_name='B'
  and C.CONSTRAINT_TYPE = 'C'

结果:

Table Name Column Name
B          B1

现在我想知道列B1引用哪个父表以及列名

2 个答案:

答案 0 :(得分:0)

我碰巧遇到了这个问题:

SELECT
FK_Table = FK.TABLE_NAME,
FK_Column = CU.COLUMN_NAME,
PK_Table = PK.TABLE_NAME,
Constraint_Name = C.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
SELECT i1.TABLE_NAME, i2.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE i1.CONSTRAINT_TYPE = 'FOREIGN KEY'
) PT ON PT.TABLE_NAME = PK.TABLE_NAME
---- optional:
ORDER BY
1,2,3,4

它应该做你想要的。

答案 1 :(得分:0)

尝试按照sqls:

按父级获取所有子表和列

SELECT distinct confk.constraint_name,
  confk.constraint_type,
  confk.table_name child_table,
  fkcon.column_name child_column,
  conpk.table_name parent_table,
  pkcon.column_name parent_column
FROM dba_constraints confk,
  dba_constraints conpk,
  dba_cons_columns pkcon,
  dba_cons_columns fkcon
WHERE confk.r_constraint_name = conpk.constraint_name
AND conpk.constraint_name     = pkcon.constraint_name
AND confk.constraint_name     = fkcon.constraint_name
AND confk.constraint_type     = 'R'
AND pkcon.owner               = 'Your schema name'
AND pkcon.table_name          ='your parent table name'
AND pkcon.column_name         ='your parent column name';

按子名称和列

获取父表名称和列
SELECT distinct confk.constraint_name,
  confk.constraint_type,
  confk.table_name child_table,
  fkcon.column_name child_column,
  conpk.table_name parent_table,
  pkcon.column_name parent_column
FROM dba_constraints confk,
  dba_constraints conpk,
  dba_cons_columns pkcon,
  dba_cons_columns fkcon
WHERE confk.r_constraint_name = conpk.constraint_name
AND conpk.constraint_name     = pkcon.constraint_name
AND confk.constraint_name     = fkcon.constraint_name
AND confk.constraint_type     = 'R'
AND fkcon.owner               = 'Your schema name'
AND fkcon.table_name          ='your child table name'
AND fkcon.column_name         ='your child column name';