Jim*_*Fan 9 mysql information-schema percona
表A具有表B(id)的外键约束(类型).但是,type不为null,id可以为空.
我正在尝试使用information_schema构建一个查询,该查询将查看外键约束并匹配列类型和可空列以查看它们是否同步,但是我遇到逻辑问题.
select kcu.table_name, kcu.column_name, c.column_type, c.is_nullable,kcu.referenced_table_name, kcu.referenced_column_name,c.column_type, c.is_nullable
from key_column_usage kcu
inner join columns c on c.table_schema=kcu.table_schema and c.column_name=kcu.column_name and c.table_name=kcu.table_name
where kcu.referenced_table_name='Table_B' and kcu.table_name='Table_A';
Run Code Online (Sandbox Code Playgroud)
我知道这种语法不正确 - 这就是我迄今为止所能完成的所有内容.我希望能够为数据库中的每个表执行此操作,并按table_name,然后是column_name对其进行排序.它可以排除column_type和is_nullable字段相同的列.
在外部约束的一侧可能存在NULLABLE列的合理原因,但这将比较所涉及列的类型/可空属性.
SELECT
kcu.constraint_schema
, kcu.constraint_name
, kcu.referenced_table_name
, kcu.referenced_column_name
, kcu.table_name
, kcu.column_name
, refcol.column_type referenced_column_type
, childcol.column_type
, refcol.is_nullable referenced_is_nullable
, childcol.is_nullable
FROM information_schema.key_column_usage kcu
INNER JOIN information_schema.columns refcol
ON refcol.table_schema = kcu.referenced_table_schema
AND refcol.table_name = kcu.referenced_table_name
AND refcol.column_name = kcu.referenced_column_name
INNER JOIN information_schema.columns childcol
ON childcol.table_schema = kcu.table_schema
AND childcol.table_name = kcu.table_name
AND childcol.column_name = kcu.column_name
WHERE (
refcol.is_nullable <> childcol.is_nullable
OR
refcol.column_type <> childcol.column_type
)
AND kcu.TABLE_SCHEMA = 'rextester' #change this value to suit
ORDER BY
kcu.table_name
, kcu.column_name
;
Run Code Online (Sandbox Code Playgroud)