[英]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.