CREATE DATABASE
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] ...
create_option: [DEFAULT] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
| ENCRYPTION [=] {'Y' | 'N'}
}
CREATE DATABASE
创建给定名称的数据库。要使用此语句,需要有CREATE DATABASE
的权限。
如果该数据库已经存在而没有指定IF NOT EXISTS
,则会发生错误。
CREATE DATABASE
不允许在已经执行了LOCK TABLES
语句的会话中使用。
create database jack;
use jack;
create table kaven (
id integer auto_increment,
primary key PRIMARY_KEY(id)
);
lock tables kaven as kv read local;
create database jack2;
Can’t execute the given command because you have active locked tables or an active transaction
MySQL使客户端会话能够明确获取表锁,以便与其他会话合作访问表,或者在会话需要独占访问表时,防止其他会话修改表。会话只能为自己获取或释放锁。一个会话不能为另一个会话获取锁或释放另一个会话持有的锁。
锁可用于模拟事务或在更新表时获得更高的速度。LOCK TABLES
显式获取当前客户端会话的表锁。可以为基表或视图获取表锁。必须拥有该LOCK TABLES
权限,以及SELECT
每个要锁定的对象的权限。这个以后再详细介绍。
每个create_option
指定一个数据库特性。数据库特征存储在数据字典中。
CHARACTER SET
选项指定默认的数据库字符集。COLLATE
选项指定默认的数据库排序规则。ENCRYPTION
在MySQL 8.0.16
中引入,该选项定义了是否对数据库加密,该加密选项由数据库中创建的表继承。允许的值为'Y'
(启用加密)和'N'
(禁用加密)。如果未指定ENCRYPTION
选项,则default_table_encryption
系统变量的值默认定义数据库加密。
要查看可用的字符集和排序规则,可以使用SHOW CHARACTER SET
和 SHOW COLLATION
语句。
MySQL中的数据库被实现为包含与数据库中的表对应的文件的目录。由于最初创建数据库时没有表,因此该CREATE DATABASE
语句仅在MySQL数据目录下创建一个目录。
MySQL 8.0
不支持通过在数据目录下手动创建目录(例如,使用mkdir
)来创建数据库目录 。
创建数据库时,让服务器管理目录和其中的文件。直接操作数据库目录和文件会导致不一致和意外结果。
MySQL对数据库的数量没有限制。底层文件系统可能对目录数量有限制。
演示
如果已经存在该数据库,则会发生错误。
create database kaven;
不存在该数据库即可创建成功。
create database test;
即使该数据库有可能存在,我们可以通过if not exists
来判断数据库是否存在,当该数据库不存在时,才创建这个数据库。
create database if not exists test;
可用字符集,每个字符集有默认的排序规则。
SHOW CHARACTER SET;
可用排序规则,有很多,博主这个版本的Mysql有272
种,每种字符集对应多种排序规则,但每种字符集只有一种排序规则是默认的,如下面框起来的一行数据。
SHOW COLLATION;
给数据库指定字符集utf8mb4
,并且会有默认排序规则utf8mb4_0900_ai_ci
。
create database if not exists jack character set 'utf8mb4';
给数据库指定字符集utf8mb4
,并且指定排序规则为utf8mb4_bin
(随便找的,没有啥依据),之后有机会再详细介绍字符集和排序规则。
create database if not exists jack character set 'utf8mb4' collate 'utf8mb4_bin';
博主这里的Mysql版本是8.0.25
,是已经支持ENCRYPTION
选项了。
select version();
给数据库指定字符集utf8mb4
,并且指定排序规则为utf8mb4_bin
,以及ENCRYPTION
选项为'Y'
,DataGrip显示的SQL语句报红,应该是DataGrip的版本问题,但SQL语句执行是成功了。
create database if not exists jack character set 'utf8mb4' collate 'utf8mb4_bin' encryption 'Y';
ALTER DATABASE
ALTER {DATABASE | SCHEMA} [db_name]
alter_option ...
alter_option: {
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| [DEFAULT] ENCRYPTION [=] {'Y' | 'N'}
| READ ONLY [=] {DEFAULT | 0 | 1}
}
ALTER DATABASE
能够更改数据库的整体特征。这些特征存储在数据字典中。此语句需要有对数据库的ALTER
特权。
如果省略数据库名称,则该语句适用于默认数据库。在这种情况下,如果没有默认数据库,则会发生错误。
对于alter_option
语句中省略的任何内容,数据库保留其当前选项值,但更改字符集可能会更改排序规则(因为每个字符集有一种默认的排序规则),反之亦然。
CHARACTER SET
选项更改默认数据库字符集。COLLATE
选项更改默认数据库排序规则。- 只有新创建的表会继承默认的数据库加密。对于与数据库关联的现有表,其加密保持不变。
READ ONLY
是在MySQL 8.0.22
中引入的选项,控制是否允许修改数据库和其中的对象。允许的值为DEFAULT
或者0
(非只读)和1
(只读)。此选项对于数据库迁移很有用,因为READ ONLY
可以将启用的数据库迁移到另一个MySQL实例,而无需担心数据库可能在操作期间发生更改。
演示
在创建test
表的时候会出现错误,因为jack
数据库现在是只读模式,不能修改数据库和其中的对象,比如这个例子,就是在该数据库中创建表。
drop database if exists jack;
create database jack character set 'utf8' encryption 'Y';
alter database jack character set 'utf8mb4' encryption 'N' read only 1;
use jack;
create table test(
id integer auto_increment,
primary key PRIMARY_KEY(id)
);
也不能修改数据库中表的数据,即数据库其中的对象,但可以select
。
drop database if exists jack;
create database jack character set 'utf8';
use jack;
create table test(
id integer auto_increment,
primary key PRIMARY_KEY(id)
);
insert into jack.test(id) values (1) , (2) , (3);
alter database jack character set 'utf8mb4' encryption 'N' read only 1;
select * from jack.test;
insert into jack.test(id) values (4) , (5) , (6);
也不能alter
数据库(除非alter
中有read only 0
,即需要先关掉只读模式,再进行修改)。
drop database if exists jack;
create database jack character set 'utf8' encryption 'Y';
alter database jack character set 'utf8mb4' encryption 'N' read only 1;
alter database jack character set 'utf8';
也不能drop
数据库。
drop database if exists jack;
create database jack character set 'utf8' encryption 'Y';
alter database jack character set 'utf8mb4' encryption 'N' read only 1;
drop database jack;
需要先把数据库的只读模式关闭掉,才能修改数据库和其中的对象。
drop database if exists jack;
create database jack character set 'utf8' encryption 'Y';
alter database jack character set 'utf8mb4' encryption 'N' read only 1;
alter database jack read only 0;
drop database jack;
数据库只读模式下,若是alter
中有read only 0
,就可以执行成功。
drop database if exists jack;
create database jack character set 'utf8' encryption 'Y';
alter database jack character set 'utf8mb4' encryption 'N' read only 1;
alter database jack character set 'utf8' read only 0;
READ ONLY
允许用于 ALTER DATABASE
,但不允许用于 CREATE DATABASE
。对于只读数据库,由SHOW CREATE DATABASE
语句得到的输出,在注释中会包含 READ ONLY=1
,以指示其只读状态。
drop database if exists jack;
create database jack character set 'utf8' encryption 'Y';
alter database jack character set 'utf8mb4' encryption 'N' read only 1;
SHOW CREATE DATABASE jack;
alter database jack character set 'utf8' read only 0;
SHOW CREATE DATABASE jack;
第一条SHOW CREATE DATABASE jack;
的输出:
CREATE DATABASE `jack` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ /* READ ONLY = 1 */
第二条SHOW CREATE DATABASE jack;
的输出:
CREATE DATABASE `jack` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */
DROP DATABASE
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
已经在上面两个语句的介绍中出现过DROP DATABASE
。
DROP DATABASE
删除数据库中的所有表并删除数据库。要使用DROP DATABASE
,需要对数据库具有DROP
权限。
删除数据库时,不会自动删除专门为该数据库授予的权限。
IF EXISTS
用于防止在数据库不存在时发生错误。
drop database if exists jack;
如果删除默认数据库,则会取消设置默认数据库(DATABASE()
函数返回 NULL
)。
use mysql;
select DATABASE();
create database if not exists jack;
use jack;
select DATABASE();
drop database if exists jack;
select DATABASE();
DROP DATABASE
返回被删除的表数。
create database if not exists jack;
use jack;
create table kaven_1 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
create table kaven_2 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
create table kaven_3 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
drop database jack;
删除数据库不会删除在该数据库中创建的任何TEMPORARY
表。TEMPORARY
表在当创建它们的会话结束时,会自动删除。
create database if not exists jack;
use jack;
create table kaven_1 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
create table kaven_2 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
create temporary table kaven_3 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
create temporary table kaven_4 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
drop database jack;
删除数据库后,TEMPORARY
表还是可以在当前会话中使用。
create database if not exists jack;
use jack;
create table kaven_1 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
create table kaven_2 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
create temporary table kaven_3 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
create temporary table kaven_4 (
id integer auto_increment ,
primary key PRIMARY_KEY(id)
);
drop database jack;
insert into jack.kaven_4(id) values (1),(2),(3);
到这里就结束啦,欢迎给博主纠正错误。
参考