MySQL 中删除表的 SQL 为 DROP TABLE,该语句不但删除数据内容,连带表结构、索引等一并删掉,如果只删除指定数据或所有数据,可以使用 DELETE 或 TRUNCATE 语句。
DROP TABLE
DROP TABLE 可以删除一个或多个表,但前提是要有对应表的 DROP 权限。
语法
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
DROP 操作对于每个表的操作,会删除表的定义和所有数据;若表有分区,分区的所有内容也会删除,切记要慎用。
此外,DROP 也会删掉表关联的所有触发器。
修饰符
DROP TABLE 走隐式提交事务,可以通过增加 TEMPORARY 修复符防止意外删除非 TEMPORARY 的表。
TEMPORARY 修饰符有以下几个作用:
- 语句仅作用在 TEMPORARY 表,即仅删除 TEMPORARY 表;
- 语句不会进行隐式事务提交(implicit commit);
- 无需校验访问权限。因为临时表只有创建它的会话可见。
IF EXISTS 修饰符提供了针对无指定表返回错误的优化操作,具体如下:
- 如果不使用 IF EXISTS,DROP 语句将删除所有存在的表,对于不存在的指定表,返回错误信息;
- 如果使用 IF EXISTS,该语句同样删除所有已存在的表,对于不存在的指定表则忽略且不返回错误信息。
RESTRICT 和 CASCADE 修饰符在 MySQL 没有任何作用,它是为了兼容从其它数据库系统移植过来的 SQL。
示例
mysql> DROP TABLE knowledgedict_tbl;
与 DELETE 和 TRUNCATE 的异同
- DROP 删除表的定义结构、所有数据及关联的触发器(trigger);
- DELETE 删除行数据,可以是某几行,也可以是所有行;
- TRUNCATE 仅删除表内所有数据。
相同点
- 三个语句都有删除数据的作用;
- DELETE 和 TRUNCATE 都只是删除数据,不删除表定义结构等;
- TRUNCATE 等同于不带 WHERE 条件的 DELETE 语句,即删除表内所有数据。
不同点
- TRUNCATE 只删除表数据,不删除表本身,不能使用事务(即和事务无关);该语句默认情况下,将空间释放到 minextents 个 extent,除非使用 reuse storage;truncate 会将 high watermark 进行复位(即回到最开始处);
- DELETE 属于数据操作语言(DML),不能自动提交事务,需要手动 commit 提交;这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发;该语句不影响表所占用的 extent,high watermark 保持原位置不动;
- DROP 属于数据定义语言(DDL),可以自动提交事务;语句将删除表的定义结构、数据、被依赖的约束(constrain)、触发器(trigger)、索引(index);而依赖于该表的存储过程和函数将保留,但是置为 invalid 状态;此外,DROP 将表所占用的空间全部释放;