SQL Server - 外部キーと参照先の一覧を取得する方法

SQL Server で外部キーと参照先の一覧を取得する方法

SQL Server で開発をしていて、マスター側の仕様変更などで、変更の影響を調べるのに、そのマスターデータを参照している外部キーの一覧を取得したいような状況ありませんか?

この記事では、SQL Server で外部キーと参照先の一覧を取得する方法をご紹介します。

システムカタログビューを使う方法

SQL Server では、sys.foreign_keyssys.foreign_key_columns などのシステムカタログビューを使って、外部キーと参照先の一覧を取得することができます。

システムカタログビューを使って、外部キーと参照先の一覧を取得するクエリーは次の通りです。

SELECT  SCHEMA_NAME(PT.schema_id) AS FK_SchemaName, -- 外部キーを持つテーブルのスキーマ
        PT.name AS FK_TableName,                    -- 外部キーを持つテーブル
        FK.name AS FK_Name,                         -- 外部キー名
        PC.name AS FK_ColumnName,                   -- 外部キーを持つカラム
        SCHEMA_NAME(RT.schema_id) AS PK_SchemaName, -- 参照先テーブルのスキーマ
        RT.name AS PK_TableName,                    -- 参照先テーブル
        RC.name AS PK_ColumnName                    -- 参照先カラム
FROM    sys.foreign_keys AS FK    
            INNER JOIN sys.foreign_key_columns AS FKC
                ON FK.object_id = FKC.constraint_object_id
            INNER JOIN sys.tables AS PT
                ON FKC.parent_object_id = PT.object_id
            INNER JOIN sys.columns AS PC
                ON FKC.parent_object_id = PC.object_id
                    AND FKC.parent_column_id = PC.column_id
            INNER JOIN sys.tables AS RT
                ON FKC.referenced_object_id = RT.object_id
            INNER JOIN sys.columns AS RC
                ON FKC.referenced_object_id = RC.object_id
                    AND FKC.referenced_column_id = RC.column_id
ORDER BY    FK_SchemaName,
            FK_TableName,          
            FK_Name,
            FK_ColumnName;

次のシステムカタログビューを結合して、外部キーを持つスキーマ・テーブル・カラムの情報と、参照先のスキーマ・テーブル・カラムの情報の一覧を取得しています。

sys.foreign_keys は外部キーの情報を返すシステムビューです。外部キー制約ごとに 1 行です。

sys.foreign_keys の name カラムが外部キー制約の名前です。

sys.foreign_key_columns は外部キーを構成する列の情報を返すシステムビューです。外部キーを構成する列または列のセットごとに 1 行です。

sys.foreign_key_columns の parent_object_id や parent_column_id が外部キーを持つテーブルやカラムの id です。

sys.foreign_key_columns の referenced_object_id や referenced_column_id が参照されるテーブルやカラムの id です。

sys.tablessys.columns はテーブルとカラムの情報を返すシステムビューです。


このクエリーを AdventureWorks2022 データベースで実行してみると、次のように外部キーと参照先の一覧を取得できています。

[実行結果]
SQL Server - 外部キーと参照先の一覧を取得する方法 1


試しに、この外部キー制約を SSMS から確認してみます。

SQL Server - 外部キーと参照先の一覧を取得する方法 2


FK_Employee_Person_BusinessEntityID の外部キー制約の情報が正しく取得できていることがわかります。

SQL Server - 外部キーと参照先の一覧を取得する方法 3


参照先の Primary Key 側のテーブル名とカラム名を指定して一覧を取得したい時は WHERE 句で次のようにフィルターできます。

SELECT  SCHEMA_NAME(PT.schema_id) AS FK_SchemaName, -- 外部キーを持つテーブルのスキーマ
        PT.name AS FK_TableName,                    -- 外部キーを持つテーブル
        FK.name AS FK_Name,                         -- 外部キー名
        PC.name AS FK_ColumnName,                   -- 外部キーを持つカラム
        SCHEMA_NAME(RT.schema_id) AS PK_SchemaName, -- 参照先テーブルのスキーマ
        RT.name AS PK_TableName,                    -- 参照先テーブル
        RC.name AS PK_ColumnName                    -- 参照先カラム
FROM    sys.foreign_keys AS FK    
            INNER JOIN sys.foreign_key_columns AS FKC
                ON FK.object_id = FKC.constraint_object_id
            INNER JOIN sys.tables AS PT
                ON FKC.parent_object_id = PT.object_id
            INNER JOIN sys.columns AS PC
                ON FKC.parent_object_id = PC.object_id
                    AND FKC.parent_column_id = PC.column_id
            INNER JOIN sys.tables AS RT
                ON FKC.referenced_object_id = RT.object_id
            INNER JOIN sys.columns AS RC
                ON FKC.referenced_object_id = RC.object_id
                    AND FKC.referenced_column_id = RC.column_id
WHERE       RT.name = 'Currency'
            AND RC.name = 'CurrencyCode'
ORDER BY    FK_SchemaName,
            FK_TableName,          
            FK_Name,
            FK_ColumnName;

RT.name が参照先のテーブル名、RC.name が参照先にカラム名です。

[実行結果]
SQL Server - 外部キーと参照先の一覧を取得する方法 4

Currency テーブルの CurrencyCode を参照している外部キー制約の一覧が取得できました。


システムストアドプロシージャを使う方法

SQL Server では、sp_fkeys というシステムストアドプロシージャを使っても、外部キーと参照先の一覧を取得することができます。

sp_fkeys は現在の環境の外部キーの情報を返すシステムストアドプロシージャで構文は次の通りです。

sp_fkeys
    [ [ @pktable_name = ] N'pktable_name' ]
    [ , [ @pktable_owner = ] N'pktable_owner' ]
    [ , [ @pktable_qualifier = ] N'pktable_qualifier' ]
    [ , [ @fktable_name = ] N'fktable_name' ]
    [ , [ @fktable_owner = ] N'fktable_owner' ]
    [ , [ @fktable_qualifier = ] N'fktable_qualifier' ]
[ ; ]

@pktable_name は、参照先のテーブル名です。

@pktable_owner は、参照先のテーブルのあるスキーマ名です。

@pktable_qualifier は、参照先のテーブルのあるデータベース名です。

@fktable_name は、外部キーを持つテーブル名です。

@fktable_owner は、外部キーを持つテーブルのあるスキーマ名です。

@fktable_qualifier は、外部キーを持つテーブルのあるデータベース名です。


引数には、少なくとも @pktable_name@fktable_name を指定する必要があります。

選択されているデータベースの情報を返すのでよければ、*_qualifier は指定しなくて大丈夫です。


それでは、sp_fkeys を使って外部キーと参照先の一覧を取得してみます。

現在のデータベースの Sales スキーマの Currency テーブルを参照している外部キーの一覧を取得するには、次のようにできます。

EXEC sp_fkeys @pktable_name = 'Currency', @pktable_owner = 'Sales';

[実行結果]
SQL Server - 外部キーと参照先の一覧を取得する方法 5

先ほど同じ 3 つの外部キー制約の情報が取得できています。


また、現在のデータベースの Sales スキーマの SalesPerson テーブルの持っている外部キー制約の一覧を取得するには、次のようにできます。

EXEC sp_fkeys @fktable_name = 'SalesPerson', @fktable_owner = 'Sales';

[実行結果]
SQL Server - 外部キーと参照先の一覧を取得する方法 6


外部キー制約の名前でフィルターしたり、自由に検索できるので、システムカタログビューを使う方法のほうが便利かもしれませんね。

以上、SQL Server で外部キーと参照先の一覧を取得する方法をご紹介しました。

© 2010-2025 SQL Server 入門