MySQL 删除表DROP TABLE

时间:2019-11-20 08:52:09  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用MySQL DROP TABLE语句从数据库中删除表。

MySQL DROP TABLE语句语法

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

这是DROP TABLE语句的基本语法:

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

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

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

IF EXISTS选项仅在表存在的情况下有条件地删除它。
如果使用IF EXISTS选项删除一个不存在的表,MySQL会生成一个NOTE,可以使用SHOW WARNINGS语句来检索该NOTE。

请注意,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)
);

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

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

假设您的数据库中有许多表的名称以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;

如您所见,输出是我们期望的。

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

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