- SQL 教程
- SQL - 首页
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 数据库
- SQL - 语法
- SQL - 数据类型
- SQL - 运算符
- SQL - 表达式
- SQL 数据库
- SQL - 创建数据库
- SQL - 删除数据库
- SQL - 选择数据库
- SQL - 重命名数据库
- SQL - 显示数据库
- SQL - 备份数据库
- SQL 表
- SQL - 创建表
- SQL - 显示表
- SQL - 重命名表
- SQL - 截断表
- SQL - 克隆表
- SQL - 临时表
- SQL - 修改表
- SQL - 删除表
- SQL - 删除表
- SQL - 约束
- SQL 查询
- SQL - 插入查询
- SQL - 选择查询
- SQL - Select Into
- SQL - Insert Into Select
- SQL - 更新查询
- SQL - 删除查询
- SQL - 排序结果
- SQL 视图
- SQL - 创建视图
- SQL - 更新视图
- SQL - 删除视图
- SQL - 重命名视图
- SQL 运算符和子句
- SQL - Where 子句
- SQL - Top 子句
- SQL - Distinct 子句
- SQL - Order By 子句
- SQL - Group By 子句
- SQL - Having 子句
- SQL - AND & OR
- SQL - BOOLEAN (BIT) 运算符
- SQL - LIKE 运算符
- SQL - IN 运算符
- SQL - ANY, ALL 运算符
- SQL - EXISTS 运算符
- SQL - CASE
- SQL - NOT 运算符
- SQL - 不等于
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 运算符
- SQL - UNION 运算符
- SQL - UNION 与 UNION ALL
- SQL - INTERSECT 运算符
- SQL - EXCEPT 运算符
- SQL - 别名
- SQL 连接
- SQL - 使用连接
- SQL - 内连接
- SQL - 左连接
- SQL - 右连接
- SQL - 交叉连接
- SQL - 全连接
- SQL - 自连接
- SQL - 删除连接
- SQL - 更新连接
- SQL - 左连接与右连接
- SQL - Union 与 Join
- SQL 键
- SQL - 唯一键
- SQL - 主键
- SQL - 外键
- SQL - 复合键
- SQL - 备选键
- SQL 索引
- SQL - 索引
- SQL - 创建索引
- SQL - 删除索引
- SQL - 显示索引
- SQL - 唯一索引
- SQL - 聚簇索引
- SQL - 非聚簇索引
- 高级 SQL
- SQL - 通配符
- SQL - 注释
- SQL - 注入
- SQL - 托管
- SQL - Min & Max
- SQL - 空值函数
- SQL - 检查约束
- SQL - 默认约束
- SQL - 存储过程
- SQL - NULL 值
- SQL - 事务
- SQL - 子查询
- SQL - 处理重复项
- SQL - 使用序列
- SQL - 自动递增
- SQL - 日期和时间
- SQL - 游标
- SQL - 公共表表达式
- SQL - Group By 与 Order By
- SQL - IN 与 EXISTS
- SQL - 数据库调优
- SQL 函数参考
- SQL - 日期函数
- SQL - 字符串函数
- SQL - 聚合函数
- SQL - 数值函数
- SQL - 文本和图像函数
- SQL - 统计函数
- SQL - 逻辑函数
- SQL - 游标函数
- SQL - JSON 函数
- SQL - 转换函数
- SQL - 数据类型函数
- SQL 有用资源
- SQL - 问答
- SQL - 快速指南
- SQL - 有用函数
- SQL - 有用资源
- SQL - 讨论
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.