首页 > 解决方案 > 如何在 SQL Server 中使用 INFORMATION_SCHEMA 查找所有表之间的所有关系?

问题描述

有没有办法通过使用来获取所有数据库表之间的所有关系INFORMATION_SCHEMA

我尝试使用INFORMATION_SCHEMA.KEY_COLUMN_USAGE它来获取它,因为它适用于 MySQL,但它在 SQL Server 中没有REFERENCED_COLUMN_NAMEREFERENCED_TABLE_NAME列。

标签: sqlsql-servertsql

解决方案


您需要更多这些视图才能获得所需的内容:

  • 指定两端的 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列,它应该为您提供哪些子列引用了哪个父列的相关性。


推荐阅读