it-swarm-vi.tech

Truy vấn các mối quan hệ Khóa ngoài của Bảng

Đối với một bảng nhất định 'foo', tôi cần một truy vấn để tạo một tập hợp các bảng có khóa ngoại trỏ tới foo. Tôi đang sử dụng Oracle 10G.

22
Mark Roddy

Điều này sẽ làm việc (hoặc một cái gì đó gần):

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

Các tuyên bố sau đây nên cung cấp cho trẻ em và tất cả con cháu của họ. Tôi đã thử nghiệm nó trên cơ sở dữ liệu 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

Đây là cách đưa truy vấn của Mike tiến thêm một bước để có được tên tên cột từ tên ràng buộc:

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

liên kết đến Tài liệu trực tuyến cơ sở dữ liệu Oracle

Bạn có thể muốn khám phá Lượt xem từ điển dữ liệu . Họ có các tiền tố:

  • Người dùng
  • Tất cả các
  • DBA

mẫu vật:

select * from dictionary where table_name like 'ALL%' 

Tiếp tục ví dụ của Mike, bạn có thể muốn tạo tập lệnh để bật/tắt các ràng buộc. Tôi chỉ sửa đổi 'chọn' ở hàng đầu tiên.

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

Tôi biết rằng hơi muộn để trả lời nhưng dù sao tôi cũng trả lời, một số câu trả lời ở trên khá phức tạp do đó ở đây đơn giản hơn nhiều.

[.__.] c TRÊN a.owner = c.owner VÀ a.constraint_name = c.constraint_name [.__. = 'R' [.___.] VÀ a.table_name = 'tên bảng của bạn'` [.__.]
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

Tải xuống Hướng dẫn tham khảo Oracle cho 10G giải thích các bảng từ điển dữ liệu.

Các câu trả lời ở trên là tốt nhưng kiểm tra các bảng khác có thể liên quan đến các ràng buộc.

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

Cuối cùng, có được một công cụ như Toad hoặc SQL Developer cho phép bạn duyệt nội dung này trong UI, bạn cần học cách sử dụng các bảng nhưng bạn cũng nên sử dụng UI.

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