it-swarm-tr.com

Bir Tablonun Yabancı Anahtar ilişkilerini sorgula

Verilen bir tablo için 'foo', foo'ya işaret eden yabancı anahtarlara sahip bir dizi tablo oluşturmak için bir sorguya ihtiyacım var. Oracle 10G kullanıyorum.

22
Mark Roddy

Bu çalışması gerekir (veya yakın bir şey):

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

Aşağıdaki ifade, çocuklara ve onların tüm soyundan gelenleri vermelidir. Oracle 10 veritabanında test ettim.

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

Kısıtlama adlarından column names almak için Mike'ın sorgusunu bir adım öteye götürmek için:

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

Oracle Database Çevrimiçi Belgeleri

Veri Sözlüğü görünümlerini incelemek isteyebilirsiniz. Önekleri var:

  • Kullanıcı
  • Herşey
  • DBA

numune:

select * from dictionary where table_name like 'ALL%' 

Mike örneğine devam ederek, kısıtlamaları etkinleştirmek/devre dışı bırakmak için komut dosyaları oluşturmak isteyebilirsiniz. Sadece ilk satırdaki 'select'i değiştirdim.

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

Cevap vermenin biraz geç olduğunu biliyorum ama yine de cevap vereyim, yukarıdaki cevapların bazıları oldukça karmaşık, bu yüzden burada çok daha basit bir işlem var.

 `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 c a.owner = c.owner AND a.constraint_name = c.constraint_name 
 c.owner = b.owner ve c.r_constraint_name b üzerindeki all_cons_columns b birleşimi = b.constraint_name 
 WHERE = 'R' 
 AND a.table_name = 'tablonun adı' [
1
arvnq
select      acc.table_name, acc.constraint_name 
from        all_cons_columns acc
inner join all_constraints ac
    on acc.constraint_name = ac.constraint_name
where       ac.r_constraint_name in (
    select  constraint_name
    from    all_constraints
    where   table_name='yourTable'
    );
0
Hiram

Veri sözlüğü tablolarını açıklayan 10G için Oracle Referans Kılavuzunu indirin.

Yukarıdaki cevaplar iyidir, ancak kısıtlamalarla ilgili olabilecek diğer tabloları inceleyin.

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

Son olarak, Toad veya SQL Developer gibi bir araca sahip olun, bu UI'da bu şeylere göz atmanıza izin verir, tabloları kullanmayı öğrenmeniz gerekir, ancak aynı zamanda bir UI kullanmanız gerekir.

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