如何检索所有 table 列、数据类型、数据长度、约束类型和引用列以及 table

How to retrieve all table columns, data type, data length, constraint type and referenced column and table

我能够列出大部分需要的信息,但不知道如何列出引用的 table 和列

需要的信息是:

  1. Table 名字
  2. 栏目名称
  3. 数据类型
  4. 约束类型
  5. 引用table
  6. 参考专栏
 SELECT
    at.owner,
    at.table_name,
    atc.column_name    AS column_names,
    atc.data_type      AS data_type,
    ac.constraint_type
FROM
         all_tables at
    JOIN all_tab_columns   atc ON at.table_name = atc.table_name
    LEFT JOIN all_cons_columns  acc ON atc.column_name = acc.column_name
                                      AND acc.table_name = at.table_name
    LEFT JOIN all_constraints   ac ON ac.constraint_name = acc.constraint_name
WHERE
    at.owner NOT IN ( 'SYS', 'SYSTEM', 'DBSNMP', 'DVSYS', 'GSMADMIN_INTERNAL',
                      'LBACSYS',
                      'MDSYS',
                      'OJVMSYS',
                      'ORDDATA',
                      'WMSYS',
                      'XDB',
                      'CTXSYS',
                      'APPQOSSYS',
                      'AUDSYS',
                      'OUTLN',
                      'DBSFWUSER',
                      'ORDSYS',
                      'OLAPSYS' )
GROUP BY
    at.owner,
    at.table_name,
    ac.constraint_type,
    atc.column_name,
    atc.data_type,
    ac.r_owner
ORDER BY
    at.owner;

有没有一种方法可以获得所有约束以及引用的键和 table 名称?我已经尝试了很多,但无法弄清楚。

您需要外部自连接。看下面的例子:

硕士table:

SQL> create table master (id_mas number constraint pk_mas primary key);

Table created.

详细信息 table,其 ID_MAS 列引用了主 table:

SQL> create table detail (id_det number constraint pk_det primary key,
  2                       id_mas number constraint fk_det_mas references master (id_mas));

Table created.

查询您正在寻找的 returns 信息。注意 outer self join with both USER_CONSTRAINTS and USER_CONS_COLUMNS (lines #8 and 9):

SQL> select mt.table_name,
  2         mtc.column_name,
  3         mt.constraint_type,
  4         --
  5         mtr.table_name ref_table_name,
  6         mtrc.column_name ref_column_name
  7  from user_constraints mt join user_cons_columns mtc on mtc.constraint_name = mt.constraint_name
  8  left join user_constraints mtr on mtr.constraint_name = mt.r_constraint_name
  9  left join user_cons_columns mtrc on mtrc.constraint_name = mtr.constraint_name
 10  where mt.table_name in ('MASTER', 'DETAIL')
 11  order by mt.table_name desc, mt.constraint_type;

TABLE_NAME      COLUMN_NAME     CONSTRAINT_TYPE REF_TABLE_NAME  REF_COLUMN_NAME
--------------- --------------- --------------- --------------- ---------------
MASTER          ID_MAS          P
DETAIL          ID_DET          P
DETAIL          ID_MAS          R               MASTER          ID_MAS

SQL>

第 3 行内容如下:在 detail table 中,id_mas 列引用了 master table 的 id_mas列。