it-swarm.it

Interroga le relazioni con le chiavi esterne di una tabella

Per una determinata tabella 'foo', ho bisogno di una query per generare un set di tabelle che hanno chiavi esterne che puntano a foo. Sto usando Oracle 10G.

22
Mark Roddy

Questo dovrebbe funzionare (o qualcosa di simile):

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

La seguente affermazione dovrebbe dare ai bambini ea tutti i loro discendenti. L'ho provato su un database 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

Ecco come prendere la query di Mike un passo avanti per ottenere i nomi column dai nomi dei vincoli:

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

collegamento a Documentazione online del database Oracle

Potresti voler esplorare le viste Data Dictionary . Hanno i prefissi:

  • Utente
  • Tutti
  • DBA

campione:

select * from dictionary where table_name like 'ALL%' 

Seguendo l'esempio di Mike, potresti voler creare script per abilitare/disabilitare i vincoli. Ho solo modificato il 'select' nella prima riga.

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

So che è un po 'tardi per rispondere ma lasciatemi rispondere comunque, alcune delle risposte di cui sopra sono piuttosto complicate, quindi ecco una presa molto più semplice.

 `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 
 UNISCITI a tutti i vincoli c ON a.owner = c.owner AND a.constraint_name = c.constraint_name 
 join all_cons_columns b su c.owner = b.owner e c.r_constraint_name = b.constraint_name 
 WHERE c.constraint_type = 'R' 
 AND a.table_name = 'nome della tua tabella'` 
1
arvnq

Scarica la Oracle Reference Guide for 10G che spiega le tabelle del dizionario dei dati.

Le risposte sopra sono buone, ma controlla le altre tabelle che possono riguardare i vincoli.

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

Infine, procurati uno strumento come Toad o SQL Developer che ti permetta di esplorare questa roba in un'interfaccia utente, devi imparare ad usare le tabelle ma dovresti anche usare un'interfaccia utente.

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