摘要:在本教程中,您将学习如何使用 MySQL DROP TABLE
语句从数据库中删除表。
MySQL DROP TABLE
语句语法
要删除现有表,请使用 MySQL DROP TABLE
语句。
以下是DROP TABLE
语句的基本语法:
DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name] ...
[RESTRICT | CASCADE]
Code language: SQL (Structured Query Language) (sql)
DROP TABLE
语句从数据库中永久删除表及其数据。在 MySQL 中,您还可以使用单个DROP TABLE
语句删除多个表,每个表之间用逗号 (,) 分隔。
TEMPORARY
选项仅允许您删除临时表。它确保您不会意外删除非临时表。
IF EXISTS
选项仅在表存在时有条件地删除该表。如果使用IF EXISTS
选项删除不存在的表,MySQL 会生成一条注释,可以使用SHOW WARNINGS
语句检索该注释。
请注意, DROP TABLE
语句仅删除表。它不会删除与表关联的特定用户权限。因此,如果创建与删除的表同名的表,MySQL会将现有权限应用到新表,这可能会带来安全风险。
RESTRICT
和CASCADE
选项是为未来版本的 MySQL 保留的。
要执行DROP TABLE
语句,您必须对要删除的表具有DROP
权限。
MySQL DROP TABLE
例
让我们举一些使用DROP TABLE
语句的示例。
A) 使用 MySQL DROP TABLE
删除单个表示例
首先,创建一个名为insurances
表用于测试目的:
CREATE TABLE insurances (
id INT AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
effectiveDate DATE NOT NULL,
duration INT NOT NULL,
amount DEC(10 , 2 ) NOT NULL,
PRIMARY KEY(id)
);
Code language: SQL (Structured Query Language) (sql)
其次,使用DROP TABLE
删除insurances
表:
DROP TABLE insurances;
Code language: SQL (Structured Query Language) (sql)
A) 使用 MySQL DROP TABLE
删除多个表
首先,创建两个名为CarAccessories
和CarGadgets
表:
CREATE TABLE CarAccessories (
id INT AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DEC(10 , 2 ) NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE CarGadgets (
id INT AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DEC(10 , 2 ) NOT NULL,
PRIMARY KEY(id)
);
Code language: SQL (Structured Query Language) (sql)
其次,使用DROP TABLE
语句删除两个表:
DROP TABLE CarAccessories, CarGadgets;
Code language: SQL (Structured Query Language) (sql)
C) 使用 MySQL DROP TABLE
删除不存在的表
此语句尝试删除不存在的表:
DROP TABLE aliens;
Code language: SQL (Structured Query Language) (sql)
MySQL 发出以下错误:
Error Code: 1051. Unknown table 'classicmodels.aliens'
Code language: SQL (Structured Query Language) (sql)
但是,如果在DROP TABLE
语句中使用IF EXISTS
选项:
DROP TABLE IF EXISTS aliens;
Code language: SQL (Structured Query Language) (sql)
MySQL 发出了警告:
0 row(s) affected, 1 warning(s): 1051 Unknown table 'classicmodels.aliens'
Code language: SQL (Structured Query Language) (sql)
要显示警告,可以使用SHOW WARNINGS
语句:
SHOW WARNINGS;
Code language: SQL (Structured Query Language) (sql)

MySQL 基于模式的DROP TABLE
假设您的数据库中有许多名称以test
开头的表,并且您希望使用单个DROP TABLE
语句删除所有这些表。
不幸的是,MySQL 没有DROP TABLE LIKE
语句可以根据模式匹配删除表:
DROP TABLE LIKE '%pattern%'
Code language: JavaScript (javascript)
但是,有一些解决方法。我们将在这里讨论其中之一,供您参考。
首先创建三个表test1
, test2
, test4
进行演示:
CREATE TABLE test1(
id INT AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE IF NOT EXISTS test2 LIKE test1;
CREATE TABLE IF NOT EXISTS test3 LIKE test1;
Code language: SQL (Structured Query Language) (sql)
假设您想要删除所有test*
表。
其次,声明两个接受数据库模式的变量以及您希望表匹配的模式:
-- set table schema and pattern matching for tables
SET @schema = 'classicmodels';
SET @pattern = 'test%';
Code language: CSS (css)
三、构造动态DROP TABLE
语句:
-- construct dynamic sql (DROP TABLE tbl1, tbl2...;)
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(@schema,'.',table_name)),';')
INTO @droplike
FROM information_schema.tables
WHERE @schema = database()
AND table_name LIKE @pattern;
Code language: SQL (Structured Query Language) (sql)
基本上,查询指示 MySQL 转到information_schema
表,该表包含所有数据库中所有表的信息,并连接数据库@schema
( classicmodels
)中与模式@pattern
( test%
)和前缀DROP TABLE
匹配的所有表DROP TABLE
。 GROUP_CONCAT
函数创建以逗号分隔的表列表。
第四,显示动态SQL来验证是否正确运行:
-- display the dynamic sql statement
SELECT @droplike;
Code language: SQL (Structured Query Language) (sql)

正如您所看到的,输出是我们所期望的。
第五,使用准备好的语句执行语句,如以下查询所示:
-- execute dynamic sql
PREPARE stmt FROM @droplike;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Code language: SQL (Structured Query Language) (sql)
把它们放在一起。
-- set table schema and pattern matching for tables
SET @schema = 'classicmodels';
SET @pattern = 'test%';
-- build dynamic sql (DROP TABLE tbl1, tbl2...;)
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(@schema,'.',table_name)),';')
INTO @droplike
FROM information_schema.tables
WHERE @schema = database()
AND table_name LIKE @pattern;
-- display the dynamic sql statement
SELECT @droplike;
-- execute dynamic sql
PREPARE stmt FROM @droplike;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Code language: SQL (Structured Query Language) (sql)
因此,如果您想删除数据库中具有特定模式的多个表,只需使用上面的脚本即可节省时间。您需要做的就是替换@pattern
和@schema
变量中的模式和数据库架构。如果你经常要处理这个任务,你可以根据脚本开发一个存储过程并重用这个存储过程。
在本教程中,您学习了如何使用 MySQL DROP TABLE
语句从数据库中删除现有表。