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

标签 sql oracle validation multiple-columns

我想对 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 表与外键表连接起来

enter image description here

更新:

我构建了以下查询,它在大多数情况下都可以正常工作

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;

最佳答案

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

这是我编写的一个示例查询,用于显示与主键对应项具有不同数据类型或数据大小的所有外键列。列数比您要求的多一些,并且我使用了“DBA”数据字典 View 而不是“ALL” View 。

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;

关于sql - oracle查询中如何识别主键表和外键表列数据类型和数据长度的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57467058/

相关文章:

sql - 将行转为列 ORACLE SQL

sql - 从oracle中的日期中提取月份和年份

sql - 当PL SQL匿名 block 完成时,为什么没有输出?

php - 单击按钮时触发 jquery validate()

jQuery Validate - 默认情况下设置所有字段为必填项?

MySQL时间格式

mysql - 从日期范围 sql 生成天数

jQuery 日期验证 - 格式和范围

mysql - 左连接 - 未知列错误 1054

mysql - 使用带有 MySQL 链接服务器的 openquery 时,宽 varchar 字段导致 "Requested conversion is not supported"错误