2010-09-20 37 views
9

Tôi dự định xóa dữ liệu khỏi bảng, tôi muốn biết có bao nhiêu bảng và bảng nào có tham chiếu khóa ngoài tới bảng cụ thể này trong Oracle. Như tôi sẽ phải thiết lập các khóa nước ngoài để null. Tôi muốn biết danh sách tất cả các bảng có FK đến bảng cụ thể này.Làm thế nào để tìm các bảng có khóa ngoài đến một bảng trong Oracle?

+2

thể trùng lặp của [Oracle tất cả các tài liệu tham khảo chính nước ngoài] (http://stackoverflow.com/questions/1171373/oracle-all-foreign-key-references) –

+0

bản sao có thể có của [Làm thế nào tôi có thể tìm thấy bảng nào tham khảo một bảng đã cho trong Oracle SQL Developer?] (Http: // stackoverflow.com/questions/1143728/how-can-i-find-which-table-reference-a-given-table-in-oracle-sql-developer) – FrustratedWithFormsDesigner

Trả lời

12
select d.table_name, 

     d.constraint_name "Primary Constraint Name", 

     b.constraint_name "Referenced Constraint Name" 

from user_constraints d, 

    (select c.constraint_name, 

      c.r_constraint_name, 

      c.table_name 

     from user_constraints c 

     where table_name='EMPLOYEES' --your table name instead of EMPLOYEES 

     and constraint_type='R') b 

where d.constraint_name=b.r_constraint_name 
+2

Tôi tin rằng phải là, '" Tham chiếu Ràng buộc Tên "', như đó là tên của ràng buộc tham chiếu đến ràng buộc chính, không phải là cách khác xung quanh. – jpmc26

0

Không cần thực hiện bước này theo cách thủ công - bạn chỉ có thể sử dụng cascading delete.

+2

Trước tiên, bạn cần * tìm * bảng có nhu cầu FK được cập nhật để cho phép xóa chữ hoa mặc dù – Brian

8
SELECT 
    FK.OWNER||'.'||FK.TABLE_NAME AS CHILD_TABLE, 
    SRC.OWNER||'.'||SRC.TABLE_NAME AS PARENT_TABLE, 
    FK.CONSTRAINT_NAME AS FK_CONSTRAINT, 
    SRC.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT 
FROM ALL_CONSTRAINTS FK 
JOIN ALL_CONSTRAINTS SRC ON FK.R_CONSTRAINT_NAME = SRC.CONSTRAINT_NAME 
WHERE 
    FK.CONSTRAINT_TYPE = 'R' 
    AND SRC.OWNER = 'MY_SCHEMA' 
    AND SRC.TABLE_NAME = 'MY_TABLE'; 

Tôi có một tình huống mà bảng mà tôi quan tâm không thuộc sở hữu của lược đồ mà tôi đã kết nối. Vì vậy, tôi cần sửa đổi truy vấn trong số currently accepted answer để sử dụng ALL_CONSTRAINTS thay vì USER_CONSTRAINTS. Trong quá trình này, tôi đã phạm sai lầm, và tôi thấy câu trả lời được chấp nhận là rất khó đọc để tôi có thể sửa nó. (Việc thiếu lời giải thích không giúp được gì.) Kết quả là tôi đã tìm ra câu hỏi của riêng mình. Về cơ bản nó giống nhau, nhưng tôi nghĩ nó dễ hơn một chút.

FK.CONSTRAINT_TYPE = 'R' lọc xuống FK thành một tập hợp các ràng buộc khóa ngoài và các cặp tham gia các khóa ngoài này với "Ràng buộc tham chiếu" của chúng. (Ràng buộc tham chiếu thường là khóa chính của bảng "cha mẹ"). Cuối cùng, chúng tôi lọc xuống bảng cha mà chúng tôi quan tâm đến việc sử dụng SRC.OWNER = 'MY_SCHEMA' AND SRC.TABLE_NAME = 'MY_TABLE'.

Tất nhiên, bạn có thể chuyển đổi điều này để sử dụng USER_CONSTRAINTS nếu bạn muốn; chỉ cần xóa séc SRC.OWNER và các tiền tố OWNER trong SELECT.

+0

FK.CONSTRAINT_TYPE = 'R' không cần thiết cho điều này – abhihello123

+0

Dịch vụ chăm sóc người quản lý có nên giải thích không? – jpmc26

+0

@ abhihello123 Có lẽ không đúng, vì 'FK.R_CONSTRAINT_NAME' có lẽ là' NULL' cho các hàng có các loại khác. Mặt khác, nó không làm tổn thương gì cả. – jpmc26

0
SELECT a.table_name, a.column_name, a.constraint_name, c.owner, 
     -- referenced pk 
     c.r_owner, c_pk.table_name r_table_name, c_pk.constraint_name r_pk 
    FROM all_cons_columns a 
    JOIN all_constraints c ON a.owner = c.owner 
         AND a.constraint_name = c.constraint_name 
    JOIN all_constraints c_pk ON c.r_owner = c_pk.owner 
          AND c.r_constraint_name = c_pk.constraint_name 
WHERE c.constraint_type = 'R' 
    AND a.table_name = :TableName 
1

Nếu bạn cũng cần các lĩnh vực để được bao gồm:

select b.table_name  "Referencing Table", 
     b.CONSTRAINT_NAME "Referencing Constraint", 
     (select wm_concat(column_name) 
      from all_cons_columns 
     where owner = b.owner 
      and constraint_name = b.CONSTRAINT_NAME 
     ) "Referencing Columns", 
     a.CONSTRAINT_NAME   "Referenced Constraint", 
     (select wm_concat(column_name) 
      from all_cons_columns 
     where owner = a.owner 
      and constraint_name = a.CONSTRAINT_NAME 
     ) "Referenced columns" 
    from all_constraints a, 
     all_constraints b 
where a.owner = b.r_owner 
    and a.owner = '<<OWNER>>' 
    and a.table_name = '<<TABLE_NAME>>' 
    and a.constraint_type in ('P', 'U') 
    and b.constraint_type = 'R' 
    and b.R_CONSTRAINT_NAME = a.constraint_name 
6

Dưới truy vấn sẽ cung cấp cho tất cả các ràng buộc khoá ngoại xác định trên TABLE_NAME:

select baseTable.* from all_constraints baseTable , all_constraints referentedTable 
    where baseTable.R_CONSTRAINT_NAME = referentedTable.CONSTRAINT_NAME 
    and baseTable.constraint_type = 'R' 
    and referentedTable.table_name = 'TABLE_NAME'; 
+0

Tại sao 'baseTable.constraint_type = 'R''? –

+1

'R' là viết tắt của Toàn vẹn tham chiếu và chúng tôi chỉ muốn kiểm tra ràng buộc khóa ngoài ở đây. Vì vậy, baseTable.constraint_type = 'R' nên được sử dụng. constraint_type cũng có thể lấy các giá trị có thể khác mà bạn có thể kiểm tra tại đây -> https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_1037.htm#i1576022 – nanosoft

+0

Truy vấn này sẽ nhận tất cả các bảng tên đó bất kể lược đồ. Nếu nhiều bảng trong các lược đồ khác nhau có cùng tên, nó sẽ chọn tất cả chúng. Điều thậm chí còn tệ hơn là việc bạn chọn các cột 'SELECT'ed làm cho nó không thể biết được * bảng nào đang được tham chiếu khi nó tìm thấy nhiều bảng. – jpmc26

0

Có lẽ tôi hiểu lầm gì Walker hỏi , nhưng điều tôi hiểu là: Cách tìm các bảng có tham chiếu khóa ngoài tới một bảng cụ thể (ví dụ: EMPLOYEES).

Nếu tôi cố gắng Kupa của câu trả lời:

select d.table_name, 
     d.constraint_name "Primary Constraint Name", 
     b.constraint_name "Referenced Constraint Name" 

from user_constraints d, 

    (select c.constraint_name, 
      c.r_constraint_name, 
      c.table_name 
     from user_constraints c 
     where table_name='EMPLOYEES' --your table name instead of EMPLOYEES 
     and constraint_type='R') b 

where d.constraint_name=b.r_constraint_name 

tôi nhận được các bảng trên mà nhân viên có một tài liệu tham khảo chính nước ngoài để.

EMPLOYEES.foreign_key => TABLES.primary_key


Xem dưới sql cập nhật để lấy các bảng mà có một tham chiếu chính nước ngoài để người lao động.

TABLES.foreign_key => EMPLOYEES.primary_key

select b.table_name "Table Name", 
    b.constraint_name "Constraint Name", 
    d.table_name "Referenced Table Name", 
    d.constraint_name "Referenced Constraint Name" 

from user_constraints d, 

(select c.constraint_name, 
     c.r_constraint_name, 
     c.table_name 
    from user_constraints c 
    where constraint_type='R') b 

where d.table_name = 'EMPLOYEES' --your table name instead of EMPLOYEES 
and b.r_constraint_name = d.constraint_name; 
Các vấn đề liên quan