参数说明
| 参数 | 说明 |
|---|---|
| CREATE DATABASE | 创建具有给定名称的数据库 |
| CREATE SCHEMA | 这是 CREATE DATABASE 的同义词 |
| IF NOT EXISTS | 用于避免在指定数据库已存在时执行出错 |
| create_specification | 指定数据库特性,如 CHARACTER SET 和 COLLATE |
第 7.1 节:创建数据库、用户和授权
创建一个数据库。注意,缩写词 SCHEMA 可用作同义词。
CREATE DATABASE Baseball; -- 创建一个名为 Baseball 的数据库
如果数据库已存在,将返回错误 1007。要避免此错误,可以使用:
CREATE DATABASE IF NOT EXISTS Baseball;
类似地:
DROP DATABASE IF EXISTS Baseball; -- 如果存在则删除数据库,避免错误 1008
DROP DATABASE xyz; -- 如果 xyz 不存在,将发生错误 1008
由于上述错误可能性,DDL 语句常与 IF EXISTS 一起使用。
可以创建带有默认 CHARACTER SET 和 collation 的数据库。例如:
CREATE DATABASE Baseball CHARACTER SET utf8 COLLATE utf8_general_ci;
查看数据库创建语句:
SHOW CREATE DATABASE Baseball;
结果示例:
+----------+--------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------+
| Baseball | CREATE DATABASE `Baseball` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------------+
查看当前数据库:
SHOW DATABASES;
结果示例:
+--------------------+
| Database |
+--------------------+
| information_schema |
| ajax_stuff |
| Baseball |
+--------------------+
设置当前活动数据库,并查看一些信息:
USE Baseball; -- 将其设置为当前数据库
SELECT @@character_set_database AS cset, @@collation_database AS col;
结果示例:
+------+-----------------+
| cset | col |
+------+-----------------+
| utf8 | utf8_general_ci |
+------+-----------------+
以上显示了数据库的默认 CHARACTER SET 和 Collation。
创建一个用户:
CREATE USER 'John123'@'%' IDENTIFIED BY 'OpenSesame';
上述命令创建用户 John123,由于使用了 % 通配符,该用户可以从任何主机名连接。用户密码设置为 'OpenSesame',该密码会被哈希存储。
再创建另一个用户:
CREATE USER 'John456'@'%' IDENTIFIED BY 'somePassword';
通过检查特殊的 mysql 数据库来显示用户已被创建:
SELECT user, host, password FROM mysql.user WHERE user IN ('John123','John456');
结果示例(密码显示为哈希值,实际输出可能不同):
+---------+------+-------------------------------------------+
| user | host | password |
+---------+------+-------------------------------------------+
| John123 | % | *B04E11FAAAEA9A... |
| John456 | % | *B04E11FAAAEA9A... |
+---------+------+-------------------------------------------+
注意,此时用户已创建,但尚未拥有使用 Baseball 数据库的任何权限。
处理用户和数据库的权限。授予用户 John123 对 Baseball 数据库的全部权限,并授予另一用户仅 SELECT 权限:
GRANT ALL ON Baseball.* TO 'John123'@'%';
GRANT SELECT ON Baseball.* TO 'John456'@'%';
验证上述授权:
SHOW GRANTS FOR 'John123'@'%';
结果示例:
+--------------------------------------------------------------------------------------------------------------+
| Grants for John123@% |
+--------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'John123'@'%' IDENTIFIED BY PASSWORD '*B04E11FAAAEA9A...' |
| GRANT ALL PRIVILEGES ON `Baseball`.* TO 'John123'@'%' |
+--------------------------------------------------------------------------------------------------------------+
SHOW GRANTS FOR 'John456'@'%';
结果示例:
+--------------------------------------------------------------------------------------------------------------+
| Grants for John456@% |
+--------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'John456'@'%' IDENTIFIED BY PASSWORD '*B04E11FAAAEA9A...' |
| GRANT SELECT ON `Baseball`.* TO 'John456'@'%' |
+--------------------------------------------------------------------------------------------------------------+
注意,你总会看到的 GRANT USAGE 仅仅意味着用户可以登录。仅此而已。
第 7.2 节:创建和选择数据库
如果管理员在设置权限时为你创建了数据库,你可以直接开始使用。否则,你需要自己创建:
mysql> CREATE DATABASE menagerie;
在 Unix 下,数据库名称是区分大小写的(与 SQL 关键字不同),因此你必须始终将数据库引用为 menagerie,而不是 Menagerie、MENAGERIE 或其他变体。表名也是如此。(在 Windows 下,此限制不适用,尽管在给定的查询中,你仍必须使用与创建数据库时相同的大小写来引用数据库和表。然而,出于多种原因,推荐的最佳实践是始终使用与创建数据库时相同的大小写。)
创建数据库并不会自动选择它供使用;你必须显式地执行此操作。要将 menagerie 设为当前数据库,请使用以下语句:
mysql> USE menagerie
Database changed
你的数据库只需要创建一次,但每次开始 mysql 会话时都必须选择它供使用。你可以像示例中那样发出 USE 语句来实现。或者,你可以在调用 mysql 时在命令行上选择数据库。只需在任何可能需要的连接参数之后指定数据库名称。例如:
shell> mysql -h host -u user -p menagerie
Enter password: ********
第 7.3 节:我的数据库
你必须创建自己的数据库,不要写入任何现有数据库。这可能是首次连接后首先要做的事情之一。
CREATE DATABASE my_db;
USE my_db;
CREATE TABLE some_table;
你可以通过使用数据库名称限定来引用表:my_db.some_table。
第 7.4 节:系统数据库
以下数据库供 MySQL 自身使用。你可以读取(SELECT)它们,但不得写入(INSERT/UPDATE/DELETE)其中的表。(有一些例外。)
mysql—— 存储GRANT信息和其他一些内容。information_schema—— 这里的表是“虚拟”的,实际上是通过内存结构实现的。它们的内容包括所有表的架构(schema)。performance_schema—— ??- 其他(用于 MariaDB、Galera、TokuDB 等)