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