Frage

Für eine gegebene Tabelle ‚foo‘, ich brauche eine Abfrage eine Reihe von Tabellen zu erzeugen, die Fremdschlüssel haben, die foo zeigen. Ich bin mit Oracle 10G.

War es hilfreich?

Lösung

Das sollte funktionieren (oder etwas in der Nähe):

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>'); 

Andere Tipps

Die folgende Anweisung sollte die Kinder und alle ihre Nachkommen geben. Ich habe es auf einer Oracle-Datenbank 10 getestet.

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

Hier ist, wie Mikes Abfrage eines Schritt weiter zu ergreifen, um die Spaltennamen aus dem Constraint-Namen zu erhalten:

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>'));

Link zu Oracle Database Online-Dokumentation

Sie können die Daten erkunden Wörterbuch Ansichten . Sie haben die Präfixe:

  • Benutzer
  • Alle
  • DBA

Beispiel:

select * from dictionary where table_name like 'ALL%' 

Weiter Mikes Beispiel, können Sie Skripte erzeugen, um die Einschränkungen zu aktivieren / deaktivieren. Ich änderte nur die ‚Auswahl‘ in der ersten Zeile.

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>');

Ich weiß, dass es ein bisschen spät ist zu beantworten, aber mir trotzdem beantworten lassen, über einige der Antworten ziemlich kompliziert sind daher hier ist eine viel einfachere nehmen.

       `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_constraints c ON a.owner = c.owner AND a.constraint_name = c.constraint_name
       join all_cons_columns b on c.owner = b.owner and c.r_constraint_name = b.constraint_name
       WHERE c.constraint_type = 'R'
       AND a.table_name = 'your table name'`
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;   

Laden Sie das Oracle-Referenzhandbuch für 10G, die die Data Dictionary-Tabellen erklärt.

Die Antworten oben sind gut, aber die anderen Tabellen überprüfen, die zu Einschränkungen beziehen.

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

Schließlich ein Tool wie Toad oder SQL Developer erhalten, die Sie dieses Material in einem UI durchsuchen kann, müssen Sie lernen, um die Tabellen zu verwenden, aber Sie sollten auch eine Benutzeroberfläche verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top