如何列出引用 SQL Server 中给定表的所有外键?

新手上路,请多包涵

我需要删除 SQL Server 数据库中高度引用的表。如何获取删除表所需删除的所有外键约束的列表?

(SQL 回答比在管理工作室的 GUI 中单击 about 更可取。)

原文由 chillitom 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 431
2 个回答

不知道为什么没有人建议,但我使用 sp_fkeys 来查询给定表的外键:

 EXEC sp_fkeys 'TableName'

您还可以指定架构:

 EXEC sp_fkeys @pktable_name = 'TableName', @pktable_owner = 'dbo'

在不指定架构的情况下, 文档 说明以下内容:

如果未指定 pktable_owner,则应用底层 DBMS 的默认表可见性规则。

在 SQL Server 中,如果当前用户拥有具有指定名称的表,则返回该表的列。如果未指定 pktable_owner 并且当前用户不拥有具有指定 pktable_name 的表,则该过程将查找数据库所有者拥有的具有指定 pktable_name 的表。如果存在,则返回该表的列。

原文由 Recep 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是我认为在 SQL Server 2016 中解决此方案的最佳实践。

您必须使用以下方法列出外键:

 EXEC sp_fkeys 'TableName'

在那里你可以看到 FK 的完整信息。请注意列 FKTABLE_NAME、FKCOLUMN_NAME、FK_NAME、UPDATE_RULE、DELETE_RULE 是您需要删除外键并在截断后再次实现它们的信息。

您可以按如下方式组织脚本:

 -- EXEC sp_fkeys 'TableName'

-- DROP CONSTRAINTS: I drop one, here drop every constraint you desire.
BEGIN TRANSACTION
GO
ALTER TABLE dbo.TableName
    DROP CONSTRAINT IF EXISTS FK_TableName_OtherTable
GO
ALTER TABLE dbo.TableName SET (LOCK_ESCALATION = TABLE)
GO
COMMIT

-- TRUNCATE
BEGIN TRANSACTION
TRUNCATE TABLE TableName
GO
COMMIT

-- RECREATE CONSTRAINTS: I recreate 1, here recreate every fk you desire
BEGIN TRANSACTION
GO
ALTER TABLE dbo.TableName SET (LOCK_ESCALATION = TABLE)
GO

ALTER TABLE dbo.TableName ADD CONSTRAINT
    FK_TableName_OtherTable FOREIGN KEY
    (
    Id_FK
    ) REFERENCES dbo.OtherTable
    (
    Id
    ) ON UPDATE  NO ACTION
     ON DELETE  NO ACTION
GO
COMMIT

\*\* UPDATE_RULE 和 DELETE_RULE 的值可以在 sp_fkeys 的文档中看到UPDATE_RULE 和 DELETE_RULE 值的 sp_fkeys 文档

原文由 Sam 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进