了解SQL Server中所有数据库表之间的关系

xor*_*wer 35 sql t-sql database sql-server

我希望大家都知道我的数据库中的表是如何相互关联的(即PK/FK/UK),因此我创建了SQL Server中所有表的数据库图.创建的图表不易读取,必须滚动(水平,有时垂直)以查看另一端的表格.

简而言之,在了解许多表之间的关系时,SQL的db图不是UI友好的.

我的(简单)问题:是否有像数据库图这样的东西可以做什么db图表但是以"好"的方式呢?

mar*_*c_s 96

有时,文字表示也可能有所帮助; 通过对系统目录视图的此查询,您可以获得所有FK关系的列表以及链接两个表(以及它们对哪些列进行操作)的列表.

SELECT
    fk.name 'FK Name',
    tp.name 'Parent table',
    cp.name, cp.column_id,
    tr.name 'Refrenced table',
    cr.name, cr.column_id
FROM 
    sys.foreign_keys fk
INNER JOIN 
    sys.tables tp ON fk.parent_object_id = tp.object_id
INNER JOIN 
    sys.tables tr ON fk.referenced_object_id = tr.object_id
INNER JOIN 
    sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN 
    sys.columns cp ON fkc.parent_column_id = cp.column_id AND fkc.parent_object_id = cp.object_id
INNER JOIN 
    sys.columns cr ON fkc.referenced_column_id = cr.column_id AND fkc.referenced_object_id = cr.object_id
ORDER BY
    tp.name, cp.column_id
Run Code Online (Sandbox Code Playgroud)

将其转储到Excel中,您可以根据父表,引用的表或其他任何内容进行切片和切块.

我发现视觉指南很有用 - 但有时,文字文档也同样好(甚至更好) - 只需2美分......


awe*_*eis 7

或者你可以看一下schemacrawler


Geo*_*ros 6

使用 INFORMATION_SCHEMA 检索相同数据的另一种方法

SQL Server 中包含的信息架构视图符合 INFORMATION_SCHEMA 的 ISO 标准定义。

sqlauthority方式

SELECT
K_Table = FK.TABLE_NAME,
FK_Column = CU.COLUMN_NAME,
PK_Table = PK.TABLE_NAME,
PK_Column = PT.COLUMN_NAME,
Constraint_Name = C.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
SELECT i1.TABLE_NAME, i2.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT ON PT.TABLE_NAME = PK.TABLE_NAME
---- optional:
ORDER BY
1,2,3,4
WHERE PK.TABLE_NAME='something'WHERE FK.TABLE_NAME='something'
WHERE PK.TABLE_NAME IN ('one_thing', 'another')
WHERE FK.TABLE_NAME IN ('one_thing', 'another')
Run Code Online (Sandbox Code Playgroud)