SQL - 删除索引


SQL 中的DROP语句用于移除或删除现有的数据库对象,例如表、索引、视图或过程。每当我们对任何数据库对象使用 DROP 语句时,它都会永久删除它们及其关联数据。

当该数据库对象是索引时,将使用 SQL 中的DROP INDEX语句。

删除 SQL 索引

可以使用 DROP INDEX 语句从数据库表中删除 SQL 索引。

重要的是要了解删除索引会对数据库查询的性能产生重大影响。因此,只有在确定不再需要索引时才尝试删除该索引。

注意- 我们无法删除由 PRIMARY KEY 或 UNIQUE 约束创建的索引。为了删除它们,您需要使用 ALTER TABLE 语句完全删除约束。

句法

以下是 SQL 中DROP INDEX命令的语法-

DROP INDEX index_name ON table_name;

这里,

  • index_name是要删除的索引的名称。
  • table_name是与索引关联的表的名称。

例子

在此示例中,我们将学习如何删除名为CUSTOMERS 的表上的索引,可以使用以下查询创建该索引 -

CREATE TABLE CUSTOMERS(
   ID INT NOT NULL,
   NAME VARCHAR(15) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS VARCHAR(25),
   SALARY DECIMAL(10, 4),
   PRIMARY KEY(ID));
);

现在,使用以下查询将一些值插入到上面创建的表中 -

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', '32', 'Ahmedabad', 2000),
(2, 'Khilan', '25', 'Delhi', 1500),
(3, 'Kaushik', '23', 'Kota', 2000),
(4, 'Chaitali', '25', 'Mumbai', 6500),
(5, 'Hardik','27', 'Bhopal', 8500),
(6, 'Komal', '22', 'Hyderabad', 9000),
(7, 'Muffy', '24', 'Indore', 5500);

创建表后,使用以下查询在 CUSTOMERS 表中的NAME列上创建索引 -

CREATE INDEX INDEX_NAME on CUSTOMERS(NAME);

现在,使用以下 SHOW INDEX 查询验证是否在 CUSTOMERS 表上创建了索引 -

SHOW INDEX FROM CUSTOMERS;

执行上述查询时,索引列表显示如下 -

桌子 非唯一 键名 索引中的序列 列名
顾客 0 基本的 1 ID
顾客 1 索引名称 1 姓名

然后,使用以下DROP INDEX语句在 CUSTOMERS 表中删除相同的索引 INDEX_NAME -

DROP INDEX INDEX_NAME ON CUSTOMERS;

输出

如果我们编译并运行上面的查询,结果将如下所示 -

Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

确认

使用以下查询验证是否删除了列 NAME 的索引 -

SHOW INDEX FROM CUSTOMERS;

在以下索引列表中,您可以观察到名称列的名称丢失

桌子 非唯一 键名 索引中的序列 列名
顾客 0 基本的 1 ID

删除 IF EXISTS 索引

SQL 中的DROP INDEX IF EXISTS语句用于仅删除表中存在的索引。当您想要删除索引,但不确定该索引是否存在时,此语句特别有用。MySQL支持该子句。

IF EXISTS子句确保该语句仅删除索引(如果存在)。如果索引不存在,则简单地终止执行。

句法

以下是 SQL 中 DROP INDEX IF EXISTS 的语法 -

DROP INDEX IF EXISTS index_name
ON table_name;

这里,

  • index_name是要删除的索引的名称。
  • table_name是与索引关联的表的名称。

例子

在此示例中,让我们尝试删除 SQL Server 数据库中的索引。

让我们考虑之前创建的表 CUSTOMERS,并使用以下查询为表中的 NAME 列创建索引 -

CREATE INDEX INDEX_NAME on CUSTOMERS(NAME);

然后,让我们使用以下查询删除它 -

DROP INDEX IF EXISTS INDEX_NAME ON CUSTOMERS;

输出

当我们执行上述查询时,获得的输出如下 -

Commands completed successfully.

确认

让我们使用以下查询验证 NAME 的索引是否已删除 -

EXEC sys.sp_helpindex @objname = N'CUSTOMERS';

正如您所观察到的,列 NAME 已从索引列表中删除。

索引名称 索引描述 索引键
PK__客户__3214EC27CB063BB7 集群、唯一、主键位于 PRIMARY 上的 PRIMARY ID

例子

现在,让我们使用以下查询删除 CUSTOMERS 表中不存在的索引-

DROP INDEX IF EXISTS INDEX_NAME ON CUSTOMERS;

输出

由于数据库中不存在指定名称的索引,因此上面的查询只是终止执行而不会给出任何错误。

Commands completed successfully.

删除 PRIMARY KEY 或 UNIQUE 创建的索引

DROP INDEX 语句不会删除由 PRIMARY KEY 或 UNIQUE 约束创建的索引。要删除与它们关联的索引,我们需要完全删除这些约束。这是使用ALTER TABLE...DROP CONSTRAINT语句完成的。

句法

以下是 SQL 中 ALTER TABLE...DROP CONSTRAINT 语句的语法 -

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

这里,

  • table_name是包含 PRIMARY KEY 约束的表的名称。
  • constraint_name是要删除的 PRIMARY KEY 约束的名称。

例子

假设之前创建的表 (CUSTOMERS),让我们首先使用以下查询列出在该表上创建的所有索引 -

EXEC sys.sp_helpindex @objname = N'CUSTOMERS';

列表显示如下 -

索引名称 索引描述 索引键
PK__客户__3214EC27CB063BB7 非聚集位于 PRIMARYID 上 ID

这里,PK__CUSTOMER__3214EC27CB063BB7是在CUSTOMERS表的ID列上创建的PRIMARY KEY约束的名称。

现在,让我们删除 PRIMARY KEY 约束创建的索引。

ALTER TABLE customers
DROP CONSTRAINT PK__CUSTOMER__3214EC27CB063BB7;

输出

当我们执行上述查询时,获得的输出如下 -

Commands completed successfully.

确认

通过使用以下查询列出现有索引来验证它是否被删除 -

EXEC sys.sp_helpindex @objname = N'CUSTOMERS';

由于索引列表为空,因此显示以下错误。

The object 'CUSTOMERS' does not have any indexes, or you do not have permissions.