SQL 删除索引

SQL 删除索引

在SQL中, DROP 语句用于删除已存在的数据库对象,例如表、索引、视图或存储过程。使用DROP语句删除任何数据库对象时,它们将被永久删除,包括相关的数据。

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

删除SQL索引

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

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

注意 :我们无法删除由主键或唯一约束创建的索引。要删除它们,您需要使用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', 'MP', 9000),
(7, 'Muffy', '24', 'Indore', 5500);

一旦表被创建,使用以下查询在CUSTOMERS表中的列 NAME 上创建一个索引

CREATE INDEX INDEX_NAME on CUSTOMERS(NAME);

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

SHOW INDEX FROM CUSTOMERS;

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

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

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

DROP INDEX

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

Table 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 子句确保仅在索引存在时才删除该索引。如果索引不存在,则仅终止执行。

语法

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.

验证

让我们使用以下查询来验证名称的索引是否被删除了:

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

正如您所观察到的,列名称在索引列表中被删除。

index_name index_description index_keys
PK__CUSTOMER__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 语句来实现。

语法

ALTER TABLE… DROP CONSTRAINT语句的SQL语法如下:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

这里,

  • table_name 是包含主键约束的表的名称。
  • constraint_name 是您要删除的主键约束的名称。

示例

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

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

列表按照如下方式显示−

index_name index_description index_keys
PK__CUSTOMER__3214EC27CB063BB7 非聚集性索引,位于PRIMARYID上 ID

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

现在,让我们删除由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.

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程