sql - 如何在 SQL Server 中使用 INFORMATION_SCHEMA 查找所有表之间的所有关系?
问题描述
有没有办法通过使用来获取所有数据库表之间的所有关系INFORMATION_SCHEMA
?
我尝试使用INFORMATION_SCHEMA.KEY_COLUMN_USAGE
它来获取它,因为它适用于 MySQL,但它在 SQL Server 中没有REFERENCED_COLUMN_NAME
和REFERENCED_TABLE_NAME
列。
解决方案
您需要更多这些视图才能获得所需的内容:
- 指定两端的 FK 列表在
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
- 引用的键和它的表名之间的映射在
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
像这样的东西应该工作:
select cu.CONSTRAINT_NAME as [ForeignKeyName],
cu.TABLE_SCHEMA as [ReferencingTableSchema],
cu.TABLE_NAME as [ReferencingTableName],
cu.COLUMN_NAME as [ReferencingColumnName],
tc.TABLE_SCHEMA as [ReferencedTableSchema],
tc.TABLE_NAME as [ReferencedTableName],
tc.CONSTRAINT_TYPE,
rc.UNIQUE_CONSTRAINT_NAME as [ReferencedKeyName]
from INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
inner join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on rc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME
inner join INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc on tc.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME
and tc.TABLE_SCHEMA = rc.UNIQUE_CONSTRAINT_SCHEMA
order by cu.TABLE_SCHEMA, cu.TABLE_NAME, cu.CONSTRAINT_NAME, cu.COLUMN_NAME;
该查询可能不是 100% 万无一失的,您需要检查多列 FK,并可能检查不同模式中的表之间的关系。不过,一个很好的起点。
哦,如果您需要父表中的列名,您将需要KEY_COLUMN_USAGE
再次,这次是引用表。使用多列 FK 可能会很棘手,请查看该ORDINAL_POSITION
列,它应该为您提供哪些子列引用了哪个父列的相关性。
推荐阅读
- cql - 在普通(非聚类)列上获得与某些标准匹配的前 N 行的最有效方法
- c# - 如何在 DataGrid 中显示一定数量的行?(C#/WPF)
- python - 聚类数据子组中的行
- sql-server - 在 SQL Server 的 ForXMLPath 查询中包含文本
- angular - Angular Reactive Forms 从 Type 生成表单控件
- curl - curl 的 RESTconf 操作
- python - 使用 Fast.AI 查找学习率/训练时出现 BrokenPipeError
- kotlin - Kotlin Coroutines:Kotlin Job() 对象有多轻量级?我可以将完成的作业留在 HashMap 中吗?
- python - 如何将 pandas_profiling 与大型数据库表一起使用
- android - AWS网关+lambda冷启动针对不同应用不同