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

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

需要的信息是:

  1. 表名
  2. 列名
  3. 数据类型
  4. 约束类型
  5. 参考表
  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;

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

【问题讨论】:

    标签: sql oracle constraints


    【解决方案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 列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 2011-01-25
      • 1970-01-01
      • 2020-04-30
      相关资源
      最近更新 更多