如何找出FOREIGN KEY约束引用SQL Server中的表?

107 sql sql-server sql-server-2008

我想删除一个表但收到以下消息:

消息3726,级别16,状态1,行3
无法删除对象'dbo.UserProfile',因为它由FOREIGN KEY约束引用.
消息2714,级别16,状态6,行2
数据库中已存在名为"UserProfile"的对象.

我浏览了SQL Server Management Studio但我无法找到约束.如何找出外键约束?

Lit*_*eas 192

这里是:

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'
Run Code Online (Sandbox Code Playgroud)

这样,您将获得引用表和列名称.

根据评论建议编辑使用sys.tables而不是通用sys.objects.谢谢,marc_s

  • 我的意思是:只需用`INNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id'替换`INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id` (3认同)
  • 您可以使用更多信息来增强您的选择: 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_id) ReferencedTable , COL_NAME(fc.referenced_object_id, fc.referenced_column_id) ReferencedColumn (2认同)

Vla*_*lav 54

另一种方法是检查结果

sp_help 'TableName'
Run Code Online (Sandbox Code Playgroud)

(或只是突出显示引用的TableName和pres ALT + F1)

随着时间的推移,我决定改进我的答案.以下是sp_help提供的结果的屏幕截图.A在此示例中使用了AdventureWorksDW2012数据库.那里有很多好的信息,我们正在寻找的是最后的 - 以绿色突出显示:

在此输入图像描述

  • +1这会提供很多有用的信息,并且会在输出的底部显示外键 (3认同)
  • 这以最少的代码行数为我提供了大量信息 (3认同)

Gay*_*i L 41

试试这个

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')
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 24

我发现这个答案非常简单,并根据我的需要做了诀窍:https://stackoverflow.com/a/12956348/652519

链接摘要,使用此查询:

EXEC sp_fkeys 'TableName'
Run Code Online (Sandbox Code Playgroud)

快速而简单.我能够很快找到15个表的所有外键表,各自的列和外键名.

正如@mdisibio在下面提到的,这里是文档的链接,详细说明了可以使用的不同参数:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp- fkeys-的Transact-SQL


Anv*_*esh 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
Run Code Online (Sandbox Code Playgroud)

  • 我一直在寻找一种方法来查看作为外键的列以及列引用的相关表,这总结得很好.谢谢! (2认同)

Lui*_* LL 6

如果要在对象浏览器窗口中通过SSMS进行操作,请右键单击要删除的对象,然后查看依赖项。


Vin*_*h_S 6

这是在所有数据库中查找外键关系的最佳方法。

exec sp_helpconstraint 'Table Name'
Run Code Online (Sandbox Code Playgroud)

还有另一种方法

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


小智 5

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;
Run Code Online (Sandbox Code Playgroud)


Dar*_*Lee 5

在 SQL Server Management Studio 中,您只需右键单击对象资源管理器中的表并选择“查看依赖关系”。这将为您提供一个良好的起点。它显示表、视图和引用该表​​的过程。