SQL Serverのテーブルを参照するFOREIGN KEY制約を見つけるにはどうすればよいですか?


119

テーブルを削除しようとしていますが、次のメッセージが表示されます。

メッセージ3726、レベル16、状態1、行3
オブジェクト 'dbo.UserProfile'は、FOREIGN KEY制約によって参照されているため、削除できませんでした。
メッセージ2714、レベル16、状態6、行2
データベースにはすでに「UserProfile」という名前のオブジェクトがあります。

SQL Server Management Studioを見回しましたが、制約が見つかりません。外部キー制約を見つけるにはどうすればよいですか?


2
Iここでより多くの方法については、sp_help「dbo.TableName」を参照してくださいよう:stackoverflow.com/questions/483193/...
マーク・Boltuc

2
Worth noticing:@LittleSweetSeasによって回答は外部キーに関する情報を返しますFOR与えられた参照テーブルしかし、@与えられたためGayathri-ヴァルマの答えの詳細親テーブル。どちらも異なるコンテキストで役立ち、どちらも独自のレースに勝利します:-)
Izhar Aazmi 2014年

回答:


224

ここにあります:

SELECT 
   OBJECT_NAME(f.parent_object_id) TableName,
   COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName
FROM 
   sys.foreign_keys AS f
INNER JOIN 
   sys.foreign_key_columns AS fc 
      ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN 
   sys.tables t 
      ON t.OBJECT_ID = fc.referenced_object_id
WHERE 
   OBJECT_NAME (f.referenced_object_id) = 'YourTableName'

このようにして、参照するテーブルと列の名前を取得します。

コメントの提案に従って、一般的なsys.objectsではなくsys.tablesを使用するように編集されました。ありがとう、marc_s


あなたはより多くの焦点を当てた使用すべきsys.tablesではなくsys.objects
marc_s

@marc_s:ありがとうございますが、例を投稿できますか?私のFK参照がない
sys.tablesのAFAIK

3
私が意味したこと:単に置き換えINNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_idてくださいINNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id
marc_s 2013

@LittleSweetSeas上記のクエリを実行しても、外部キー制約があったテーブルのobject_nameと列名が取得されません
Smart003

SELECT f.name ConstraintName、f.type_desc ConstraintType、OBJECT_NAME(f.parent_object_id)ConstrainedTable、COL_NAME(fc.parent_object_id、fc.parent_column_id)ConstrainedColumn、OBJECT_NAME(f.referenced_object) 、COL_NAME(fc.referenced_object_id、fc.referenced_column_id)ReferencedColumn
DocOc 2017

73

別の方法はの結果を確認することです

sp_help 'TableName'

(または引用符で囲まれたTableNameを強調表示し、ALT + F1を押します)

時間が経つにつれ、私は自分の答えを絞り込むことにしました。以下は、sp_help提供される結果のスクリーンショットです。この例では、AdventureWorksDW2012 DBを使用しています。そこには多くの優れた情報があり、私たちが探しているのは最後の部分です-緑で強調表示されています:

ここに画像の説明を入力してください


3
+1これは多くの役立つ情報を提供し、出力の下部に外部キーを示します
Hux

1
これにより、最小限のコード行で多くの情報を得ることができます
Rennish Joseph

これが一番カッコいいショートカットです!スキーマを更新するためにCtl-Rを完全に打ち負かしました!
ヤング氏

ローカルInteliSenseキャッシュの更新= Ctrl + Shift + R; Ctrl + R =結果ペインの表示/非表示(または少なくともこれらはSSMS2008およびSSMS2014のデフォルトです)
Vladislav

44

これを試して

SELECT
  object_name(parent_object_id) ParentTableName,
  object_name(referenced_object_id) RefTableName,
  name 
FROM sys.foreign_keys
WHERE parent_object_id = object_id('Tablename')

1
短くてエレガントで、プラスの効果があります!name返される値は内部名(メソッド)であり、親テーブルの実際の列名ではありません。これを修正する方法はありますか?
ハマンサミュエル

ここで、ParentTableNameTablenamewhere句の指定された ' ' と常に同じであることを確認します(含まれている場合)。これは意図的なものである可能性があり、複数のテーブルを照会する場合により役立ちます。
Izhar Aazmi 2014年

28

私はこの答えを非常に簡単に見つけ、私が必要なもののためのトリックを行いました:https : //stackoverflow.com/a/12956348/652519

リンクからの要約は、次のクエリを使用します。

EXEC sp_fkeys 'TableName'

すばやく簡単。15個のテーブルのすべての外部キーテーブル、それぞれの列、外部キー名をすばやく見つけることができました。

@mdisibioは、以下に述べたように、ここで使用することができ、異なるパラメータを詳細にドキュメントへのリンクです:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp- fkeys-transact-sql


1
フィルター処理するパラメーターは他に5つあります。最も役立つのは、デフォルト以外のスキーマを指定できる2番目のパラメーターです。例EXEC sp_fkeys 'Payroll', 'accounting'
mdisibio

8

このスクリプトを使用して、外部キーに関連するすべての詳細を検索しています。INFORMATION.SCHEMAを使用しています。以下はSQLスクリプトです。

SELECT 
    ccu.table_name AS SourceTable
    ,ccu.constraint_name AS SourceConstraint
    ,ccu.column_name AS SourceColumn
    ,kcu.table_name AS TargetTable
    ,kcu.column_name AS TargetColumn
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
    INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
        ON ccu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME 
    INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu 
        ON kcu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME  
ORDER BY ccu.table_name

2
私は、外部キーである列と、列が参照する関連テーブルを表示する方法を探していましたが、これによりうまくまとめられます。ありがとう!
Nate Kindrew、2015

@LittleSweetSeasの回答がそれらを示している間、これは私のテーブルのいくつかにいくつかの外部キーが欠けていました
Seafish

7

オブジェクトエクスプローラーウィンドウでSSMS経由で移動する場合は、ドロップするオブジェクトを右クリックして、依存関係を表示します。


7

これは、すべてのデータベースで外部キーの関係を見つけるための最良の方法です。

exec sp_helpconstraint 'Table Name'

そしてもう一つの方法

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME='Table Name'
--and left(CONSTRAINT_NAME,2)='FK'(If you want single key)

このソリューションexec sp_helpconstraint 'Table Name'は、すべての行を返す唯一のソリューションです。ただし、制約名は意味不明なものです。PRIMARY KEY (clustered) PK__org_soft__3213E83FE6B07364
Tor

4
SELECT 
    obj.name      AS FK_NAME,
    sch.name      AS [schema_name],
    tab1.name     AS [table],
    col1.name     AS [column],
    tab2.name     AS [referenced_table],
    col2.name     AS [referenced_column]
FROM 
     sys.foreign_key_columns fkc
INNER JOIN sys.objects obj
    ON obj.object_id = fkc.constraint_object_id
INNER JOIN sys.tables tab1
    ON tab1.object_id = fkc.parent_object_id
INNER JOIN sys.schemas sch
    ON tab1.schema_id = sch.schema_id
INNER JOIN sys.columns col1
    ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
INNER JOIN sys.tables tab2
    ON tab2.object_id = fkc.referenced_object_id
INNER JOIN sys.columns col2
    ON col2.column_id = referenced_column_id 
        AND col2.object_id =  tab2.object_id;

1

-次のようにすると、探している情報がさらに増える場合があります。

create Procedure spShowRelationShips 
( 
    @Table varchar(250) = null,
    @RelatedTable varchar(250) = null
)
as
begin
    if @Table is null and @RelatedTable is null
        select  object_name(k.constraint_object_id) ForeginKeyName, 
                object_name(k.Parent_Object_id) TableName, 
                object_name(k.referenced_object_id) RelatedTable, 
                c.Name RelatedColumnName,  
                object_name(rc.object_id) + '.' + rc.name RelatedKeyField
        from sys.foreign_key_columns k
        left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id
        left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id
        order by 2,3

    if @Table is not null and @RelatedTable is null
        select  object_name(k.constraint_object_id) ForeginKeyName, 
                object_name(k.Parent_Object_id) TableName, 
                object_name(k.referenced_object_id) RelatedTable, 
                c.Name RelatedColumnName,  
                object_name(rc.object_id) + '.' + rc.name RelatedKeyField
        from sys.foreign_key_columns k
        left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id
        left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id
        where object_name(k.Parent_Object_id) =@Table
        order by 2,3

    if @Table is null and @RelatedTable is not null
        select  object_name(k.constraint_object_id) ForeginKeyName, 
                object_name(k.Parent_Object_id) TableName, 
                object_name(k.referenced_object_id) RelatedTable, 
                c.Name RelatedColumnName,  
                object_name(rc.object_id) + '.' + rc.name RelatedKeyField
        from sys.foreign_key_columns k
        left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id
        left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id
        where object_name(k.referenced_object_id) =@RelatedTable
        order by 2,3



end

1

Foreign Keys@LittleSweetSeasの回答を適応させることにより、に関するすべての情報を返すこともできます。

SELECT 
   OBJECT_NAME(f.parent_object_id) ConsTable,
   OBJECT_NAME (f.referenced_object_id) refTable,
   COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName
FROM 
   sys.foreign_keys AS f
INNER JOIN 
   sys.foreign_key_columns AS fc 
      ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN 
   sys.tables t 
      ON t.OBJECT_ID = fc.referenced_object_id
order by
ConsTable

1

SQL Server Management Studioでは、オブジェクトエクスプローラーでテーブルを右クリックし、[依存関係の表示]を選択するだけです。これはあなたに良い出発点を与えるでしょう。テーブル、ビュー、およびテーブルを参照するプロシージャが表示されます。


0

次のクエリを試してください。

select object_name(sfc.constraint_object_id) AS constraint_name,
       OBJECT_Name(parent_object_id) AS table_name ,
       ac1.name as table_column_name,
       OBJECT_name(referenced_object_id) as reference_table_name,      
       ac2.name as reference_column_name
from  sys.foreign_key_columns sfc
join sys.all_columns ac1 on (ac1.object_id=sfc.parent_object_id and ac1.column_id=sfc.parent_column_id)
join sys.all_columns ac2 on (ac2.object_id=sfc.referenced_object_id and ac2.column_id=sfc.referenced_column_id) 
where sfc.parent_object_id=OBJECT_ID(<main table name>);

これにより、参照されるconstraint_name、column_names、および制約に依存するテーブルが存在します。


0

このクエリを使用して、Foreign key制約を表示できます。

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='YourTable'

http://blog.sqlauthority.com/2006/11/01/sql-server-query-to-display-foreign-key-relationships-and-name-of-the-constraint-for-each-table-から取得データベース内/


0

取得するための最も簡単な方法Primary KeyForeign Keyテーブルのためには、次のとおりです。

/*  Get primary key and foreign key for a table */
USE DatabaseName;

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME LIKE 'PK%' AND
TABLE_NAME = 'TableName'

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE CONSTRAINT_NAME LIKE 'FK%' AND
TABLE_NAME = 'TableName'

0

オブジェクトエクスプローラーで、テーブルを展開し、キーを展開します。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.