web-dev-qa-db-fra.com

Interroger les relations de clé étrangère d'une table

Pour une table donnée 'foo', il me faut une requête pour générer un ensemble de tables contenant des clés étrangères pointant vers foo. J'utilise Oracle 10G.

22
Mark Roddy

Cela devrait fonctionner (ou quelque chose de proche):

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 déclaration suivante devrait donner aux enfants et à tous leurs descendants. Je l'ai testé sur une base de données 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

Voici comment aller encore plus loin dans la requête de Mike pour obtenir le noms de colonne} des noms de contrainte:

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

lien vers documentation en ligne de base de données Oracle

Vous voudrez peut-être explorer les vues du dictionnaire de données . Ils ont les préfixes:

  • Utilisateur
  • Tout
  • DBA

échantillon:

select * from dictionary where table_name like 'ALL%' 

En reprenant l'exemple de Mike, vous souhaiterez peut-être générer des scripts pour activer/désactiver les contraintes. J'ai seulement modifié le "select" dans la première ligne.

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

Je sais qu'il est un peu tard pour répondre, mais laissez-moi répondre, certaines des réponses ci-dessus sont assez compliquées, voici donc une prise beaucoup plus simple.

 `SELECT nom_table.table, tableau.nom_colonne, colonne_enfant, nom_constraint, 
 Nom_table_colonne, nom_table_colonne, nom_colonne_colonne 
 FROM tout_cons_columns a 
 Tout c ON a.owner = c.owner ET a.constraint_name = c.constraint_name 
 rejoindre tous_cons_colonnes B sur c.owner = b.owner et c.r_constraint_name = b.constraint_name 
 WHERE c.constraint_type = 'R' 
 AND a.table_name = 'votre nom de table'` 
1
arvnq

Téléchargez le Guide de référence Oracle pour 10G, qui explique les tables du dictionnaire de données.

Les réponses ci-dessus sont bonnes, mais consultez les autres tableaux qui peuvent être liés à des contraintes.

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

Enfin, obtenez un outil comme Toad ou SQL Developer qui vous permet de parcourir ces éléments dans une interface utilisateur. Vous devez apprendre à utiliser les tables, mais vous devez également utiliser une interface utilisateur.

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