如何找出哪些外键约束引用SQLServer中的表?

如何找出哪些外键约束引用SQLServer中的表?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我试图放下一张桌子,但收到以下消息: Msg 3726,第16级,状态1,第3行 无法删除对象“dbo.UserProfile”,因为它被外键约束引用。 Msg 2714,第16级,第6状态,第2行 数据库中已存在名为“UserProfile”的对象 我使用SQLServerManagementStudio四处查看,但找不到约束条件。如何查找外键约束?如果要通过对象资源管理器窗口上的SSM,请右键单击要删除的对象,查看依赖项。这是: SELECT OBJECT_NAME(f.parent

我试图放下一张桌子,但收到以下消息:

Msg 3726,第16级,状态1,第3行
无法删除对象“dbo.UserProfile”,因为它被外键约束引用。
Msg 2714,第16级,第6状态,第2行
数据库中已存在名为“UserProfile”的对象


我使用SQLServerManagementStudio四处查看,但找不到约束条件。如何查找外键约束?

如果要通过对象资源管理器窗口上的SSM,请右键单击要删除的对象,查看依赖项。

这是:

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.tables而不是通用sys.objects。 谢谢,marc_s

试试这个

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')

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

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)

另一种方法是检查测试结果

sp_help 'TableName'
(或者只需突出显示引用的表名并按ALT+F1)

随着时间的推移,我决定完善我的答案。下面是
sp\u help
提供的结果截图。A在本例中使用了AdventureWorksDW2012数据库。那里有许多好信息,我们正在寻找的是最末尾的信息-以绿色突出显示:

--以下内容可能会为您提供更多您想要的内容:

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

我发现这个答案很简单,并根据我的需要做了一些技巧:

要从链接中获取摘要,请使用以下查询:

EXEC sp_fkeys 'TableName'
快速简单。我能够很快找到所有外键表、相应的列和15个表的外键名


正如@mdisibio在下面提到的,这里有一个指向文档的链接,详细说明了可以使用的不同参数:

尝试以下查询

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>);
选择对象名称(sfc.constraint\u object\u id)作为约束名称,
对象名称(父对象id)作为表名称,
ac1.name作为表\列\名称,
对象名称(引用对象id)作为引用表名称,
ac2.name作为参考\列\名称
来自sys.foreign\u key\u列sfc
将sys.all_列ac1连接到(ac1.object_id=sfc.parent_object_id和ac1.column_id=sfc.parent_column_id)
连接上的sys.all_列ac2(ac2.object_id=sfc.referenced_object_id和ac2.column_id=sfc.referenced_column_id)
其中sfc.parent_object_id=object_id();

这将给出约束名称、将引用的列名称以及依赖于约束的表

我正在使用此脚本查找与外键相关的所有详细信息。 我正在使用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

您可以使用此查询显示
外键
常量:

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'

摘自

您还可以通过添加@littlesweets作为答案返回所有关于
外键的信息

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

获取表的
主键
外键
的最简单方法是:

/*  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'

在SQLServerManagementStudio中,只需右键单击 对象资源管理器并选择“查看依赖项”。这会给你一个惊喜 良好的起点。它显示引用的表、视图和过程
表。

在对象资源管理器中,展开表,然后展开键:



你应该使用更集中的
sys.tables
而不是
sys.objects
@marc\u s:谢谢,但是你能举个例子吗?在sys.tables中,我没有FK引用我的意思:只需将
内部连接sys.objects替换为o.OBJECT\u ID=fc上的o。引用的\u OBJECT\u ID
替换为t.OBJECT\u ID=fc上的
内部连接sys.tables t。引用的\u OBJECT\u ID
@littlesweets因为我已经运行了上面的查询,所以我仍然没有得到表的对象名和列名其中有一个外键约束您可以用更多的信息来增强您的选择:选择f.name约束名称,f.type描述约束类型,OBJECT\u name(f.parent\u OBJECT\u id)ConstrainedTable,COL\u name(fc.parent\u OBJECT\u id,fc.parent\u column\u id)constrained column,OBJECT\u name(f.referenced\u OBJECT\u id)ReferencedTable,COL\u name(fc.referenced\u object\u id,fc.referenced\u column\u id)referenced column简短而优雅,加上对我有用!唯一的问题是返回的
name
值是一个内部名称(methinks),而不是父表中的实际列名。有没有办法解决这个问题?我在这里看到的是,
ParentTableName
将始终与where子句(如果包含)中给定的“
Tablename
”相同。这可能是有意的,并且在查询多个表时会更有用。我喜欢sp_help“dbo.TableName”,更多方法请参见此处:
值得注意:
Answer by@LittleSweetSeas将返回给定引用表的外键信息,但是@Gayathri Varma会返回给定父表的答案详细信息。两者都是在不同的环境中有用,并且双方都赢得了各自的比赛:-)+1这提供了很多有用的信息,并且在输出的底部显示外键这在最小的代码行数中为我提供了很多信息这是最酷的捷径!完全击败Ctl-R来刷新模式!刷新本地智能感知缓存=Ctrl+Shift+R;Ctrl+R=show/hide results pane(或至少这是我对SSMS2008和SSMS2014的默认设置)。此解决方案是唯一一个为我返回任何行的解决方案。然而,合同名称是胡言乱语
PRIMARY KEY(clustered)PK__org_soft__3213;e83fe6b07364
只有当您有足够的权限访问表信息时,这才有效。SchemaI正在寻找一种方法来查看外键列和列引用的相关表,这很好地总结了它。谢谢这在我的一些表中丢失了一些外键,同时向它们显示还有五个其他参数要过滤,th
/*  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'