【问题标题】:How to identify difference in primary key table and foreign key table columns datatype and datalength in oracle query如何在oracle查询中识别主键表和外键表列数据类型和数据长度的差异
【发布时间】:2019-08-12 19:19:00
【问题描述】:

我想对 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

我想检索以下格式的所有列以进行验证...不确定如何使用外键表加入 all_constraint 表

更新:

我构建了以下查询,它适用于大多数情况

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;

【问题讨论】:

    标签: sql oracle validation multiple-columns


    【解决方案1】:

    除了 all_constraints 和 all_cons_columns 之外,没有“外键表”。听起来您需要将这两个视图相互连接,一次获取主键或唯一键列,一次获取外键列。然后将每个连接到 all_tab_columns 以获取数据类型和数据长度。请注意,并非所有数据类型都会使用 data_length 列;对于数字类型,您需要使用 data_scale 和 data_precision。

    这是我创建的一个示例查询,用于显示所有外键列的数据类型或数据大小与其对应的主键对应的数据类型或数据大小不同。列数比您要求的多,我使用了“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;
    

    【讨论】:

    • 谢谢@AndyDan...我无法检索预期的差异。我已经用解决方案更新了问题
    猜你喜欢
    • 2013-02-19
    • 1970-01-01
    • 2017-04-05
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多