简体   繁体   English

如何在oracle查询中识别主键表和外键表列数据类型和数据长度的差异

[英]How to identify difference in primary key table and foreign key table columns datatype and datalength in oracle query

I would like to do a quick validation on oracle database to make sure all the foreign key table columns are synchronized with primary key table on size and type.我想对 oracle 数据库进行快速验证,以确保所有外键表列在大小和类型上与主键表同步。

SELECT  
a.table_name, 
a.column_name, 
b.data_type,
b.data_length, 
a.constraint_name  
FROM ALL_CONS_COLUMNS A JOIN ALL_CONSTRAINTS C  
ON A.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
JOIN all_tab_columns b ON a.owner = b.owner and a.table_name=b.table_name 
and a.column_name=b.column_name

I would like to retrieve all columns as below format for validation...Not sure how can I join the all_constraint table with foreign key table我想按照以下格式检索所有列以进行验证...不知道如何将 all_constraint 表与外键表连接起来

在此处输入图片说明

Update:更新:

I constructed the below query and it works fine for most of the cases我构建了以下查询,它在大多数情况下都可以正常工作

SELECT DISTINCT *
    FROM
      (SELECT a.table_name,
        a.column_name,
        b.data_type,
        b.data_length,
        c.r_constraint_name,
        b.owner
      FROM ALL_CONS_COLUMNS A
      JOIN ALL_CONSTRAINTS C
      ON A.CONSTRAINT_NAME = C.CONSTRAINT_NAME
      JOIN all_tab_columns b
      ON a.owner          = b.owner
      AND a.table_name    =b.table_name
      AND a.column_name   =b.column_name
      WHERE A.OWNER       ='SCHEMA_NAME'
      AND CONSTRAINT_TYPE = 'R'
      ) a
    LEFT JOIN
      (SELECT a.table_name AS fk_table_name,
        a.column_name      AS fk_column_name,
        b.data_type        AS fk_data_type,
        b.data_length      AS fk_data_length,
        a.constraint_name  AS fk_constraint_name,
        b.owner            AS fk_owner
      FROM ALL_CONS_COLUMNS A
      JOIN ALL_CONSTRAINTS C
      ON A.CONSTRAINT_NAME = C.CONSTRAINT_NAME
      JOIN all_tab_columns b
      ON a.owner                = b.owner
      AND a.table_name          =b.table_name
      AND a.column_name         =b.column_name
      WHERE A.OWNER             ='SCHEMA_NAME'
      ) b ON a.r_constraint_name=b.fk_constraint_name
    WHERE b.fk_owner LIKE '%SCHEMA_NAME%'
    AND b.fk_column_name IS NOT NULL
    AND (a.data_type!     =b.fk_data_type
    OR a.data_length!     =b.fk_data_length)
    ORDER BY a.table_name,
      a.column_name DESC;

There is no "foreign key table", other than all_constraints and all_cons_columns.除了 all_constraints 和 all_cons_columns 之外,没有“外键表”。 Sounds like you need to join those two views to each other, once to get the primary or unique key columns, and once to get the foreign key columns.听起来您需要将这两个视图相互连接,一次获取主键或唯一键列,一次获取外键列。 Then join each of those to all_tab_columns to get the data types and data lengths.然后将其中的每一个加入 all_tab_columns 以获取数据类型和数据长度。 Note that not all data types will use the data_length column;请注意,并非所有数据类型都会使用 data_length 列; for number types you will need to use data_scale and data_precision.对于数字类型,您需要使用 data_scale 和 data_precision。

Here's a sample query I whipped up to show all the foreign key columns with different datatypes or data sizes than their primary key counterparts.这是我创建的一个示例查询,用于显示与主键对应的数据类型或数据大小不同的所有外键列。 There are a few more columns than you requested, and I used the 'DBA' data dictionary views rather than the 'ALL' views.列数比您要求的多,我使用了“DBA”数据字典视图而不是“ALL”视图。

select pk.table_name,
       pk.constraint_name,
       pkc.column_name,
       pktabc.data_type,
       pktabc.data_length,
       pktabc.data_precision,
       pktabc.data_scale,
       fk.constraint_name     fk_constraint_name,
       fk.table_name          fk_table_name,
       fkc.column_name        fk_column_name,
       fktabc.data_type       fk_data_type,
       fktabc.data_length     fk_data_length,
       fktabc.data_precision  fk_data_precision,
       fktabc.data_scale      fk_data_scale
  from dba_constraints  pk
  join dba_cons_columns pkc on pkc.constraint_name  = pk.constraint_name
  join dba_tab_columns  pktabc on pktabc.table_name = pkc.table_name
                    and pktabc.column_name          = pkc.column_name
  join dba_constraints  fk  on fk.r_constraint_name = pk.constraint_name
  join dba_cons_columns fkc on fkc.constraint_name  = fk.constraint_name
                    and fkc.position                = pkc.position
  join dba_tab_columns  fktabc on fktabc.table_name = fkc.table_name
                    and fktabc.column_name          = fkc.column_name
 where pk.constraint_type in ('P', 'U')
   and fk.constraint_type  = 'R'
   and (pktabc.data_type      <> fktabc.data_type      or
        pktabc.data_length    <> fktabc.data_length    or
        pktabc.data_precision <> fktabc.data_precision or
        pktabc.data_scale     <> fktabc.data_scale)
order by pk.table_name, pk.constraint_name, pkc.column_name, pkc.position;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM