Skip to main content

MySQL下拉表

MySQL DROP TABLE语句语法

要删除现有表,可以使用MySQL DROP TABLE语句。

以下是DROP TABLE语句的基本语法:

DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name] ...
[RESTRICT | CASCADE]

DROP TABLE语句从数据库中永久删除表及其数据。在MySQL中,还可以使用一个DROP TABLE语句删除多个表,每个表之间用逗号(,)分隔。

临时选项仅允许删除临时表。它确保您不会意外删除非临时表。

IF EXISTS选项仅在表存在时才有条件地删除该表。如果使用If EXISTS选项删除不存在的表,MySQL将生成一个注释,可以使用SHOW WARNINGS语句检索该注释。

请注意,DROP TABLE语句只删除表。它不会删除与表关联的特定用户权限。因此,如果创建的表与删除的表同名,MySQL会将现有权限应用于新表,这可能会带来安全风险。

RESTRICT和CASCADE选项是为MySQL的未来版本保留的。

要执行DROP TABLE语句,必须对要删除的表具有DROP权限。

MySQL下拉表示例

让我们举一些使用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)
);

其次,使用DROP表删除保险表:

DROP TABLE insurances;

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)
);

其次,使用DROP TABLE语句删除这两个表:

DROP TABLE CarAccessories, CarGadgets;

C) 使用MySQL DROP TABLE删除不存在的表

此语句尝试删除不存在的表:

DROP TABLE aliens;

MySQL发布了以下错误:

Error Code: 1051. Unknown table 'classicmodels.aliens'

但是,如果在DROP TABLE语句中使用if EXISTS选项:

DROP TABLE IF EXISTS aliens;

MySQL发出了警告:

0 row(s) affected, 1 warning(s): 1051 Unknown table 'classicmodels.aliens'

要显示警告,可以使用show WARNINGS语句:

SHOW WARNINGS;

MySQL DROP TABLE removes non existing table

基于模式的MySQL DROP表

假设数据库中有许多表的名称以test开头,并且希望使用一条DROP TABLE语句删除所有表。

不幸的是,MySQL没有DROP TABLE-LIKE语句可以基于模式匹配删除表:

DROP TABLE LIKE '%pattern%'

然而,也有一些变通办法。我们将在这里讨论其中一个,供您参考。

首先,创建三个表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;

假设您希望删除所有test*表。

其次,声明两个变量,它们接受数据库模式和希望表匹配的模式:

-- set table schema and pattern matching for tables
SET @schema = 'classicmodels';
SET @pattern = 'test%';

第三,构造一个动态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;

基本上,查询指示MySQL转到information_schema表,该表包含所有数据库中所有表的信息,并将数据库@schema(classicmodels)中与模式@pattern(test%)匹配的所有表与前缀DROP表连接起来。GROUP_CONCAT函数创建一个以逗号分隔的表列表。

第四,显示动态SQL以验证其是否正常工作:

-- display the dynamic sql statement
SELECT @droplike;

mysql drop table like

正如你所看到的,输出是我们所期望的。

第五,使用准备好的语句执行该语句,如以下查询所示:

-- execute dynamic sql
PREPARE stmt FROM @droplike;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

把这一切放在一起。

-- 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;

因此,如果要删除数据库中具有特定模式的多个表,只需使用上面的脚本即可节省时间。您只需在@pattern和@schema变量中替换模式和数据库模式。如果经常需要处理此任务,可以基于脚本开发存储过程并重用此存储过程。

在本教程中,您学习了如何使用MySQL DROP TABLE语句从数据库中删除现有表。