Sql 简明教程

SQL - Drop Index

SQL 中的 DROP 语句用于删除或删除现有的数据库对象,例如表、索引、视图或过程。每当我们在任何数据库对象中使用 DROP 语句时,它将连同它们的相关数据一起永久删除它们。

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

Dropping an SQL Index

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

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

Syntax

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

DROP INDEX index_name ON table_name;

在此,

  1. index_name 是要删除的索引名称。

  2. table_name 是索引关联的表名称。

Example

在此示例中,我们将了解如何删除名为 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;

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

Table

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;

Output

如果我们编译并运行上述查询,则结果将生成如下:

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

Verification

使用以下查询验证是否已删除了列 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 not 支持此子句。

IF EXISTS 子句确保此语句仅在索引存在时才删除索引。如果索引不存在,它只终止执行。

Syntax

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

DROP INDEX IF EXISTS index_name
ON table_name;

在此,

  1. index_name 是要删除的索引名称。

  2. table_name 是索引关联的表名称。

Example

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

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

CREATE INDEX INDEX_NAME on CUSTOMERS(NAME);

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

DROP INDEX IF EXISTS INDEX_NAME ON CUSTOMERS;

Output

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

Commands completed successfully.

Verification

让我们使用以下查询验证 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

Example

现在,让我们使用以下查询删除 CUSTOMERS 表中的索引 that doesn’t exist

DROP INDEX IF EXISTS INDEX_NAME ON CUSTOMERS;

Output

由于数据库中不存在具有指定名称的索引,因此上面的查询在不给出任何错误的情况下直接终止执行。

Commands completed successfully.

Removing indexes created by PRIMARY KEY or UNIQUE

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

Syntax

以下是在 SQL 中 ALTER TABLE…​ DROP CONSTRAINT 语句的语法:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

在此,

  1. table_name 是包含 PRIMARY KEY 约束的表的名称。

  2. constraint_name 是您要删除的 PRIMARY KEY 约束的名称。

Example

假设先前创建的表(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;

Output

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

Commands completed successfully.

Verification

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

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

将显示以下错误,因为索引列表为空。

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