我想对 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;
最佳答案
除了 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/