我应该使用 information_schema.referential_constraints 还是 sys.foreign_keys 来检查密钥的存在?

Ale*_*lex 4 sql t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*Aza 5

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

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