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

Posted

技术标签:

【中文标题】如何检索所有表列、数据类型、数据长度、约束类型以及引用的列和表【英文标题】:How to retrieve all table columns, data type, data length, constraint type and referenced column and table 【发布时间】:2021-08-07 14:22:29 【问题描述】:

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

需要的信息是:

    表名 列名 数据类型 约束类型 参考表 参考栏目
 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;

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

【问题讨论】:

【参考方案1】:

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

主表:

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

Table created.

明细表,其ID_MAS 列引用主表:

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.

返回您正在寻找的信息的查询。注意 USER_CONSTRAINTSUSER_CONS_COLUMNS 的外部自连接(第 8 行和第 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>

第三行读作:在detail 表中,有id_mas 列引用master 表的id_mas 列。

【讨论】:

以上是关于如何检索所有表列、数据类型、数据长度、约束类型以及引用的列和表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle二维表的创建与约束以及修改

汇总数据

汇总数据

如何通过脚本自动生成临时表列和数据类型

我想知道 c# 中 ms access 数据库表列的确切数据类型(dbtype)

SQL 服务器查询以获取表中的列列表以及数据类型、NOT NULL 和 PRIMARY KEY 约束