在MySQL中删除数据表时有两种情况:删除与其他表没有关联关系的数据表,以及删除有外键约束的主表。本节简单介绍两种情况下如何删除数据表。
8.4.1 删除没有关联关系的数据表
在MySQL中,当一张数据表没有与其他任何数据表形成关联关系时,可以将当前数据表直接删除。
1.语法格式
删除没有关联关系的数据表的语法格式如下:
DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n]
2.简单示例
首先,查看商品数据库goods中的所有数据表。
mysql> SHOW TABLES;
+------------------+
| Tables_in_goods |
+------------------+
| t_goods |
| t_goods_category |
| t_goods_snapshot |
| t_goods_tmp |
+------------------+
4 rows in set (0.01 sec)
接下来,删除数据表t_goods_snapshot。
mysql> DROP TABLE t_goods_snapshot;
Query OK, 0 rows affected (0.01 sec)
再次查看商品数据库goods中的所有数据表。
mysql> SHOW TABLES;
+------------------+
| Tables_in_goods |
+------------------+
| t_goods |
| t_goods_category |
| t_goods_tmp |
+------------------+
3 rows in set (0.00 sec)
数据表t_goods_snapshot已经被成功删除。
当数据库中不存在要删除的数据表时,使用“DROP TABLE 表名”的语法删除数据表时MySQL会报错。例如,再次删除商品数据库goods中的t_goods_snapshot数据表。
mysql> DROP TABLE t_goods_snapshot;
ERROR 1051 (42S02): Unknown table 'goods.t_goods_snapshot'
由于商品数据库goods中已经不存在t_goods_snapshot数据表,所以MySQL抛出未知的数据表错误。此时可以使用“DROP TABLE IF EXISTS 表名”的语法使MySQL不再抛出错误信息。
mysql> DROP TABLE IF EXISTS t_goods_snapshot;
Query OK, 0 rows affected, 0 warning (0.00 sec)
IF EXISTS的含义为:如果当前数据库中存在相应的数据表,则删除数据表;如果当前数据库中不存在相应的数据表,则忽略删除语句,不再执行删除数据表的操作。
8.4.2 删除有外键约束的主表
删除有外键约束的主表时,如果直接删除主表,MySQL会报错。此时,有两种方式删除有外键约束的主表,一种方式是先删除有外键约束的从表,再删除主表;另一种方式为先解除外键约束,再删除主表。
在大多数情况下,删除有外键约束的主表时需要保留从表,所以本节先简单介绍如何解除外键约束,然后再删除主表。另一种方式是先删除从表,再删除主表,这种方式比较简单,读者只需要按照顺序先删除从表,再删除主表即可。
在8.1.3节中,数据表t_goods_category与数据表t_goods具有外键约束,并且t_goods_category为主表,t_goods为从表。此时,直接删除主表t_goods_category,MySQL会抛出错误信息。
mysql> DROP TABLE t_goods_category;
ERROR 3730 (HY000): Cannot drop table 't_goods_category' referenced by a foreign key constraint
'foreign_category' on table 't_goods'.
可以看到,直接删除主表t_goods_category时,MySQL会抛出“不能删除表t_goods_category,在t_goods中存在外键约束”。
接下来按照8.3.9节中的介绍,取消数据表t_goods_category与数据表t_goods的外键约束。
再次执行删除主表t_goods_category的SQL语句如下:
mysql> DROP TABLE t_goods_category;
Query OK, 0 rows affected (0.00 sec)
SQL语句执行成功,再次查看商品数据库goods中的数据表。
mysql> SHOW TABLES;
+-----------------+
| Tables_in_goods |
+-----------------+
| t_goods |
| t_goods_tmp |
+-----------------+
2 rows in set (0.00 sec)
数据表t_goods_category已经被成功删除。