164

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

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

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

4

16 に答える 16

283

ここにあります:

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

于 2013-07-06T10:08:00.427 に答える
109

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

sp_help 'TableName'

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

時間が経つにつれて、私は自分の答えを洗練することにしました。以下は、sp_help提供される結果のスクリーンショットです。この例では、AdventureWorksDW2012 DB を使用しました。そこには多くの良い情報があり、私たちが探しているのは一番最後にあります - 緑色でハイライトされています:

ここに画像の説明を入力

于 2014-06-02T11:16:33.027 に答える
48

これを試して

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')
于 2013-07-06T10:08:23.600 に答える
36

私はこの答えが非常に簡単であることに気づき、必要なもののトリックを行いました: https://stackoverflow.com/a/12956348/652519

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

EXEC sp_fkeys 'TableName'

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

@mdisibio が以下に示したように、使用できるさまざまなパラメーターについて詳しく説明しているドキュメントへのリンクを次に示します。 fkeys-transact-sql

于 2014-11-20T21:43:21.880 に答える
14

すべてのデータベースで外部キーの関係を見つける最良の方法は次のとおりです。

exec sp_helpconstraint 'Table Name'

そしてもう1つの方法

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME='Table Name'
--and left(CONSTRAINT_NAME,2)='FK'(If you want single key)
于 2014-05-27T11:09:50.023 に答える
13

このスクリプトを使用して、外部キーに関連するすべての詳細を検索しています。私は 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
于 2015-08-03T06:30:23.043 に答える
7

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

于 2013-07-06T10:07:52.313 に答える
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
于 2014-06-18T18:12:56.863 に答える
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
于 2015-10-27T14:10:36.450 に答える
0

テーブルを取得する最も簡単な方法は次のとおりPrimary Keyです。Foreign 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'
于 2016-03-22T15:40:57.823 に答える
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、および制約に依存するテーブルが表示されます。

于 2015-07-20T09:23:55.973 に答える