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;

执行上述查询后,索引列表将显示如下:

Non_unique Key_name Seq_in_index Column_name
customers 0 PRIMARY 1 ID
customers 1 index_name 1 NAME

然后,使用以下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;

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

Non_unique Key_name Seq_in_index Column_name
customers 0 PRIMARY 1 ID

DROP INDEX with 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列已从索引列表中删除。

index_name index_description index_keys
PK__CUSTOMER__3214EC27CB063BB7 clustered, unique, primary key locatedPRIMARY on 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';

列表显示如下:

index_name index_description index_keys
PK__CUSTOMER__3214EC27CB063BB7 nonclustered located on 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.
广告