📜  查询以生成查询以删除 ms sql server 中的主键或外键 - SQL (1)

📅  最后修改于: 2023-12-03 14:55:37.308000             🧑  作者: Mango

查询以生成查询以删除 MS SQL Server 中的主键或外键 - SQL

本篇文章介绍如何使用 SQL 查询语句生成主键或外键删除语句。

查询主键

要查询表中的主键,可以使用以下 SQL 语句:

SELECT
    KCU.TABLE_SCHEMA,
    KCU.TABLE_NAME,
    KCU.CONSTRAINT_NAME,
    KCU.COLUMN_NAME
FROM
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
    ON TC.TABLE_SCHEMA = KCU.TABLE_SCHEMA
     AND TC.TABLE_NAME = KCU.TABLE_NAME
     AND TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME
WHERE
    TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
ORDER BY
    KCU.TABLE_SCHEMA,
    KCU.TABLE_NAME,
    KCU.CONSTRAINT_NAME,
    KCU.ORDINAL_POSITION;

此查询返回三个字段:TABLE_SCHEMATABLE_NAMECONSTRANT_NAME。这些字段组合起来表示主键所在的表和其名字。

此外,查询还返回一个名为 COLUMN_NAME 的字段。此字段包含主键所使用的列的名称。在生成删除语句时,需要使用此信息。

查询外键

查询外键的方法与查询主键非常相似。可以使用以下 SQL 语句:

SELECT
    F.TABLE_SCHEMA,
    F.TABLE_NAME,
    F.CONSTRAINT_NAME,
    CU.COLUMN_NAME,
    RC.TABLE_SCHEMA AS REFERENCED_TABLE_SCHEMA,
    RC.TABLE_NAME AS REFERENCED_TABLE_NAME,
    RC.COLUMN_NAME AS REFERENCED_COLUMN_NAME
FROM
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS F
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
    ON F.CONSTRAINT_SCHEMA = CU.CONSTRAINT_SCHEMA
     AND F.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
    ON F.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA
     AND F.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
ORDER BY
    F.TABLE_SCHEMA,
    F.TABLE_NAME,
    F.CONSTRAINT_NAME,
    CU.ORDINAL_POSITION;

此查询返回六个字段:TABLE_SCHEMATABLE_NAMECONSTRAINT_NAMECOLUMN_NAMEREFERENCED_TABLE_SCHEMAREFERENCED_TABLE_NAME。这些字段组合起来表示外键所在的表和其名字、引用表所在的数据库、表和列的名字。

在生成删除语句时,需要使用这些信息。主要是 TABLE_SCHEMATABLE_NAMECONSTRAINT_NAME 用于指示要删除的外键,REFERENCED_TABLE_SCHEMAREFERENCED_TABLE_NAMEREFERENCED_COLUMN_NAME 用于指示引用列。

生成删除语句

有了查询结果,可以使用以下 SQL 语句生成删除主键或外键的语句:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME]
DROP CONSTRAINT [CONSTRAINT_NAME];

或者,如果要删除外键:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME]
DROP CONSTRAINT [CONSTRAINT_NAME];

这些 SQL 语句使用查询结果中的 TABLE_SCHEMATABLE_NAMECONSTRAINT_NAME 字段中的值。对于外键,还需要使用查询结果中的 REFERENCED_TABLE_SCHEMAREFERENCED_TABLE_NAMEREFERENCED_COLUMN_NAME 字段中的值。

结论

本文介绍了如何使用 SQL 查询语句生成删除主键或外键的语句。您可以将这些查询与 ALTER TABLE 语句结合使用来删除不再需要的约束。