Mysql 8 - SQL全新版本之CREATE DATABASE、ALTER DATABASE、DROP DATABASE

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选项指定默认的数据库排序规则。
  • ENCRYPTIONMySQL 8.0.16中引入,该选项定义了是否对数据库加密,该加密选项由数据库中创建的表继承。允许的值为'Y'(启用加密)和 'N'(禁用加密)。如果未指定ENCRYPTION选项,则default_table_encryption 系统变量的值默认定义数据库加密。

要查看可用的字符集和排序规则,可以使用SHOW CHARACTER SETSHOW 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);

在这里插入图片描述

到这里就结束啦,欢迎给博主纠正错误。

参考

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITKaven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值