在MySQL里,删除数据库是个基础操作,但也不是随手一敲就能完事的——有语法、有权限、还有两个不能碰的系统库。下面就来把这个细节彻底说清楚。
语法
当需要移除一个已有的数据库时,使用DROP DATABASE语句,标准格式如下:

DROP DATABASE [IF EXISTS] <数据库名>
各部分的含义:
- <数据库名>:指定要删除的数据库名称。
- IF EXISTS:可选项,用于防止当数据库不存在时抛出错误。加了它,即使删一个不存在的库也不会报错。
- DROP DATABASE:会删除数据库中所有的表格,同时将数据库本身也一并移除。执行这条语句需要拥有数据库的
DROP权限。
特别需要注意:MySQL安装后会自动创建information_schema和mysql这两个系统数据库,里面存放着数据库运行的核心信息。如果手滑把它们删了,MySQL将无法正常工作。所以操作前一定要确认目标库是不是系统库。
例子
先用CREATE DATABASE TEST_DEL;创建一个测试数据库,再用SHOW DATABASES;查看当前已有数据库:
mysql> CREATE DATABASE TEST_DEL;
Query OK, 1 row affected (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
| test2 |
| test3 |
| test4 |
| test5 |
| test6 |
| test_del |
| tset |
+--------------------+
12 rows in set (0.03 sec)
现在用DROP DATABASE TEST_DEL;将该数据库删除,再次查看所有数据库,会发现test_del已经消失了:
mysql> DROP DATABASE TEST_DEL;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
| test2 |
| test3 |
| test4 |
| test5 |
| test6 |
| tset |
+--------------------+
11 rows in set (0.04 sec)
如果此时再次尝试删除同一个数据库,程序就会报错:
mysql> DROP DATABASE TEST_DEL;
1008 - Can't drop database 'test_del'; database doesn't exist
这时前面提到的IF EXISTS就派上用场了。加上它之后再执行,即使数据库不存在也不会报错:
mysql> DROP DATABASE IF EXISTS TEST_DEL;
Query OK, 0 rows affected (0.00 sec)
一个干净利落的无错误返回。所以日常操作中,养成加IF EXISTS的习惯是一个好办法,尤其当删除操作在脚本里自动执行时,可以有效避免因数据库不存在而中断流程。
