Làm thế nào để lấy dữ liệu ràng buộc khóa ngoại


9

Tôi đang tìm kiếm một truy vấn cho phép truy xuất các thông tin khóa ngoại (mỗi dòng: bảng & trường tham chiếu, bảng & trường được tham chiếu) của toàn bộ lược đồ.

Tôi đã tìm thấy cái này, nhưng không cung cấp tất cả thông tin tôi cần: /programming/4389228/sql-for-oracle-to-check-if-a-constraint-exists

Tôi hiện đang làm việc với nó và có thể kết thúc với một giải pháp trong vài phút / giờ tiếp theo. Nhưng nếu ai đó đã có một giải pháp làm việc đầy đủ, tôi sẽ rất vui khi biết nó :)


Đối với Nhà phát triển SQL, bạn có thể tìm thấy thông tin này ở định dạng ERD trong tab 'Mô hình' trên bảng (như được tham chiếu ở đây . Không hữu ích cho tập lệnh, nhưng nếu bạn chỉ cần thông tin và hạ cánh ở đây như tôi đã làm, thì có thể hữu ích.
SnoringFrog

Câu trả lời:


12

Sau một số "kỹ thuật đảo ngược" đối với các truy vấn được thực hiện bởi công cụ Navicat khi mở cửa sổ bảng thiết kế cho một bảng (truy vấn truy xuất thông tin về khóa ngoại xuất hiện trong cửa sổ lịch sử ), đây là một giải pháp:

SELECT
    CONS.CONSTRAINT_NAME,
    CONS.TABLE_NAME,
    COLS.COLUMN_NAME,
    CONS.R_CONSTRAINT_NAME,
    CONS_R.TABLE_NAME R_TABLE_NAME,
    COLS_R.COLUMN_NAME R_COLUMN_NAME

FROM USER_CONSTRAINTS CONS
    LEFT JOIN USER_CONS_COLUMNS COLS ON COLS.CONSTRAINT_NAME = CONS.CONSTRAINT_NAME
    LEFT JOIN USER_CONSTRAINTS CONS_R ON CONS_R.CONSTRAINT_NAME = CONS.R_CONSTRAINT_NAME
    LEFT JOIN USER_CONS_COLUMNS COLS_R ON COLS_R.CONSTRAINT_NAME = CONS.R_CONSTRAINT_NAME

-- returns only foreign key constraints
WHERE CONS.CONSTRAINT_TYPE = 'R'

ORDER BY CONS.TABLE_NAME, COLS.COLUMN_NAME

2

SQL Developer gửi một báo cáo thực hiện điều này.

Nó chỉ làm cho lược đồ đăng nhập, nhưng nó là một sửa chữa nhanh chóng để làm cho nó đi từng FK trong cơ sở dữ liệu - mặc dù bạn có thể muốn bỏ qua các lược đồ như 'APEX ...' và 'SYS.'

Nó cũng bỏ qua những thứ như, các bảng trong thùng rác.

Báo cáo ban đầu nằm trong bảng Báo cáo, trong báo cáo từ điển dữ liệu.

Đây là truy vấn sửa đổi để có được TẤT CẢ các FK.

    SELECT
    c.owner "Owner",
    c.table_name "Table_Name",
    c.constraint_name "Constraint_Name",
    c.delete_rule "Delete_Rule",
    d.columns,
    c.r_owner "Owner of Related Table",
    (
        SELECT
            r.table_name
        FROM
            sys.all_constraints r
        WHERE
            c.r_owner = r.owner
        AND
            c.r_constraint_name = r.constraint_name
    ) "Related Table",
    c.r_constraint_name "Related Constraint"
FROM
    sys.all_constraints c,
    (
        SELECT
            a.owner,
            a.table_name,
            a.constraint_name,
            MAX(
                DECODE(position,1,substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,2,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,3,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,4,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,5,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,6,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,7,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,8,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,9,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,10,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,11,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,12,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,13,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,14,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,15,','
                 ||  substr(column_name,1,30),NULL)
            )
             ||  MAX(
                DECODE(position,16,','
                 ||  substr(column_name,1,30),NULL)
            ) columns
        FROM
            sys.all_constraints a,
            sys.all_cons_columns b
        WHERE
            a.constraint_name = b.constraint_name
        AND
            a.owner = b.owner
        AND
            a.constraint_type = 'R'
        AND
            substr(a.table_name,1,4) != 'BIN$'
        AND
            substr(a.table_name,1,3) != 'DR$'
        AND (
                :table_name IS NULL
            OR
                instr(upper(a.table_name),upper(:table_name) ) > 0
        ) GROUP BY
            a.owner,
            a.table_name,
            a.constraint_name
    ) d
WHERE
    c.owner = d.owner
AND
    c.table_name = d.table_name
AND
    c.constraint_name = d.constraint_name
ORDER BY
    c.owner,
    c.table_name,
    c.constraint_name

Và đây là những gì báo cáo đó trông như thế nào.

nhập mô tả hình ảnh ở đây


1

Một mã phức tạp một chút cũng đưa ra nhận xét về cols (dựa trên mã Frosty):

SELECT
    dt.table_name, dt.column_name, dt.data_type, dt.data_length,
    constr.r_tbl r_table, constr.r_col r_column,
    comm.comments
  FROM user_col_comments comm, user_tab_columns dt
  LEFT OUTER JOIN (
    SELECT
      cons.table_name tbl,
      cols.column_name col,
      cons_r.table_name r_tbl,
      cols_r.column_name r_col
    FROM user_constraints cons
      LEFT JOIN user_cons_columns cols ON cols.constraint_name = cons.constraint_name
      LEFT JOIN user_constraints cons_r ON cons_r.constraint_name = cons.r_constraint_name
      LEFT JOIN user_cons_columns cols_r ON cols_r.constraint_name = cons.r_constraint_name
    WHERE cons.constraint_type = 'R'
    ) constr ON constr.tbl = dt.table_name AND constr.col = dt.column_name
  WHERE dt.table_name = comm.table_name
    AND dt.column_name = comm.column_name
  ORDER BY dt.table_name, dt.column_name
  ;

Để làm cho đầu ra dễ đọc hơn tôi sử dụng break on TABLE_NAME;trong sqlplus(nhìn vào câu hỏi của tôi /programming/14998296/print-only-first-unique-value-for-column-that-order-by-in-oracle-sqlplus / ).

CẬP NHẬT Truy vấn đơn giản thu thập danh sách các bảng có tham chiếu FK đến bảng đã cho (hữu ích nếu bạn muốn xóa các ràng buộc sau khi đổi tên bảng):

select * from SYS.USER_CONSTRAINTS cons
  join SYS.USER_CONSTRAINTS rcons on rcons.CONSTRAINT_NAME = cons.R_CONSTRAINT_NAME
  where cons.CONSTRAINT_TYPE = 'R' and rcons.TABLE_NAME 'TBL_NAME';

select * from SYS.USER_CONSTRAINTS cons
  join SYS.USER_CONSTRAINTS rcons on rcons.CONSTRAINT_NAME = cons.R_CONSTRAINT_NAME
  where cons.CONSTRAINT_TYPE = 'R' and rcons.TABLE_NAME like '%/_OLD' escape '/';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.