it-swarm-eu.dev

Dotaz na vztahy zahraničních klíčů tabulky

Pro danou tabulku 'foo' potřebuji dotaz, který vygeneruje sadu tabulek, které mají cizí klíče, které ukazují na foo. Používám Oracle 10G.

22
Mark Roddy

To by mělo fungovat (nebo něco zavřít):

select table_name
from all_constraints
where constraint_type='R'
and r_constraint_name in 
  (select constraint_name
  from all_constraints
  where constraint_type in ('P','U')
  and table_name='<your table here>'); 
41
Mike Monette

Následující prohlášení by mělo dát dětem a všem jejich potomkům. Testoval jsem to na databázi Oracle 10.

SELECT  level, main.table_name  parent,
    link.table_name child
FROM    user_constraints main, user_constraints link    
WHERE   main.constraint_type    IN ('P', 'U')
AND link.r_constraint_name  = main.constraint_name
START WITH main.table_name  LIKE UPPER('&&table_name')
CONNECT BY main.table_name = PRIOR link.table_name
ORDER BY level, main.table_name, link.table_name
4
richard.j.lewis

Zde je návod, jak se Mikeův dotaz posunout o krok dále, abyste dostali názvy sloupců z názvů omezení:

select * from user_cons_columns
where constraint_name in (
  select constraint_name 
  from all_constraints
  where constraint_type='R'
  and r_constraint_name in 
    (select constraint_name
    from all_constraints
    where constraint_type in ('P','U')
    and table_name='<your table name here>'));
2
matt1616

odkaz na Oracle Database Online Documentation

Možná budete chtít prozkoumat pohledy Data Dictionary . Mají předpony:

  • Uživatel
  • Všechno
  • DBA

vzorek:

select * from dictionary where table_name like 'ALL%' 

Pokračování Mikeova příkladu, můžete chtít generovat skripty pro povolení/zakázání omezení. V prvním řádku jsem upravil pouze výběr.

select  'alter table ' || TABLE_NAME || ' disable constraint ' || CONSTRAINT_NAME || ';'
from all_constraints
where constraint_type='R'
and r_constraint_name in 
  (select constraint_name
  from all_constraints
  where constraint_type in ('P','U')
  and table_name='<your table here>');
1
Tony R

Vím, že je to docela pozdě odpovědět, ale dovolte mi odpovědět stejně, některé z výše uvedených odpovědí jsou poměrně složité, proto zde je mnohem jednodušší vzít.

 `SELECT a.table_name child_table, a.column_name child_column, a.constraint_name, 
 B.table_name parent_table, b.column_name parent_column 
 FROM all_cons_columns a 
 JOIN all_constrans c ON a.owner = c.owner A a.constraint_name = c.constraint_name 
 připojit all_cons_columns b na c.owner = b.owner a c.r_constraint_name = b.constraint_name 
 WHERE c.constraint_type = 'R' 
 A a.table_name = 'název vaší tabulky'` 
1
arvnq

Stáhněte si Referenční příručku Oracle pro 10G, která vysvětluje tabulky datového slovníku.

Výše uvedené odpovědi jsou dobré, ale podívejte se na další tabulky, které se mohou týkat omezení.

SELECT * FROM DICT WHERE TABLE_NAME LIKE '%CONS%';

Nakonec, získejte nástroj, jako je toad nebo SQL Developer, který vám umožní procházet tyto věci v uživatelském rozhraní, musíte se naučit používat tabulky, ale měli byste také používat uživatelské rozhraní.

0
Ethan Post
select distinct table_name, constraint_name, column_name, r_table_name, position, constraint_type 
from (
    SELECT uc.table_name, 
    uc.constraint_name, 
    cols.column_name, 
    (select table_name from user_constraints where constraint_name = uc.r_constraint_name) 
        r_table_name,
    (select column_name from user_cons_columns where constraint_name = uc.r_constraint_name and position = cols.position) 
        r_column_name,
    cols.position,
    uc.constraint_type
    FROM user_constraints uc
    inner join user_cons_columns cols on uc.constraint_name = cols.constraint_name 
    where constraint_type != 'C'
) 
start with table_name = '&&tableName' and column_name = '&&columnName'  
connect by nocycle 
prior table_name = r_table_name 
and prior column_name = r_column_name;   
0
Abu Turab