MySQL 基础教程

MySQL 高级教程

MySQL SQL 语句

MySQL 笔记

MySQL 删除表操作语句(DROP TABLE)详解


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,该语句同样删除所有已存在的表,对于不存在的指定表则忽略且不返回错误信息。

RESTRICTCASCADE 修饰符在 MySQL 没有任何作用,它是为了兼容从其它数据库系统移植过来的 SQL。

示例

mysql> DROP TABLE knowledgedict_tbl;

与 DELETE 和 TRUNCATE 的异同

  1. DROP 删除表的定义结构、所有数据及关联的触发器(trigger);
  2. DELETE 删除行数据,可以是某几行,也可以是所有行;
  3. 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 将表所占用的空间全部释放;