sql - 我应该使用 information_schema.referential_constraints 还是 sys.foreign_keys 来检查 key 的存在?

标签 sql sql-server tsql foreign-keys

在删除之前,我一直在检查外键是否存在,如下所示:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
        WHERE CONSTRAINT_NAME ='FK_Table1_Table2')
    ALTER TABLE dbo.Table1
        DROP CONSTRAINT FK_Table1_Table2

然后我突然想到有一个 sys.foreign_keys表也​​保存了这些信息,现在我不确定哪个是最好的。

我的猜测是,如果我知道我只会删除 FK,那么我应该使用 sys.foreign_keys ,但如果我不知道我要放弃什么类型的约束,我应该使用前一种方法。这样对吗?我是否遗漏了任何重要的差异?

最佳答案

如果您只使用 MS SQL 服务器,我建议使用来自 sys 架构的 View ,因为您可以获得更多信息。 sys 架构由 MS SQL 定义。您可以获得各种特定于 MS SQL 且在其他 DBMS 中没有对应信息的信息。

如果您关心可移植性,如果您想遵守其他数据库,请使用 INFORMATION_SCHEMA,因为这是跨数据库 ISO 标准。任何声称支持此标准的数据库都必须以相同的方式返回数据。因此这种方法有局限性。

关于sql - 我应该使用 information_schema.referential_constraints 还是 sys.foreign_keys 来检查 key 的存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6100280/

相关文章:

sql - 为什么我要在默认目录旁边创建另一个目录?

sql-server - 添加具有生成名称的 DEFAULT 约束

sql - 比较两个表 ID 并根据相同的 ID 创建第三列

sql-server - 如果 SQL Server 中存在列,如何更新表?

sql-server - SQL Server 表所有者 - 更改默认值

asp.net - 在哪里可以获得用于 SQL Server 的简单时区表?

sql - DB2 LIKE 匹配模式

c# - .NET 有免费的 SQL 格式化库吗?

php - 查询在正确执行时不获取数据

sql - 逐行求和并选择结果集中的其他列