MySQL DROP TABLE

摘要:在本教程中,您将学习如何使用 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会将现有权限应用到新表,这可能会带来安全风险。

RESTRICTCASCADE选项是为未来版本的 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删除多个表

首先,创建两个名为CarAccessoriesCarGadgets表:

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 删除不存在的表

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)
mysql drop table like

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

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

-- 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语句从数据库中删除现有表。

本教程有帮助吗?