DDL(1)表和库的基础操作
2025-12-05 本文已影响0人
温岭夹糕
实验环境
mysql8.0
DDL简介
DDL(data definition Language 数据定义语言)是SQL的三大核心子集之一(DML/DCL),专门用于定义/修改/删除数据库对象的结构(而非操作数据本身)
数据库操作
创建数据库
手册定义
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] ...
create_option: [DEFAULT] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
| ENCRYPTION [=] {'Y' | 'N'}
}
- character set选项指定默认字符集,默认的 MySQL 服务器字符集和排序规则是utf8mb4和utf8mb4_0900_ai_ci
使用以下命令查看支持的字符集
show character set;
#charset一列表示支持的字符集
show collation;
字符集问题不仅会影响数据存储,还会影响客户端程序与mysql服务器的通信,显示使用字符集命令
SET NAMES 'utf8mb4'
- collate指定默认数据库的排序规则,查看与utf8mb4相关的字符集排序
show collation where Charset='utf8mb4';
其中collate的命名规则如下
字符集名称_语言_比较规则后缀
utf8mb4_unicode_ci
常见的后缀含义
后缀 含义 示例效果
| 后缀 | 含义 |
|---|---|
| ci | case insensitive(不区分大小写) |
| cs | case sensitive(区分大小写) |
| bin | 二进制比较 |
- ENCRYPTION在8.0.16中引入,是数据库加密选项
综上创建一个test数据库的完整语句就是
mysql> CREATE DATABASE if not exists \
-> test character set=utf8mb4 \
-> collate=utf8mb4_unicode_ci;
创建表格
表数据的存储文件
8.0之后默认使用Innodb引擎
- 独立表空间创建的表,表数据和关联索引存储在data文件夹的.db文件中(与表名相同)
- 在共享表空间中创建的存放在ibdata文件中*(一般仅在特殊场景下才如大量小表,考虑使用)
配置innbodb_file_per_table选项控制在哪个表空间
创建表格选项(table_option) TABLESPACE也能控制
[mysqld]配置,5.6版本以后默认开启
innodb_file_per_table = ON -- 推荐生产环境启用
我们可以想到每个表对应独立的文件,删除时直接删除文件,不会产生内存碎片,甚至能对单个表进行迁移备份
列选项
- json列不能被索引
- 对于char/varchar/binary/varbinary列可以创建仅使用前导部分的索引,即col_name(len),这样能使得列索引文件减小
- 如果未指定NULL或NOT NULL,则默认NULL
- auto_increment,每个表只能有一个auto_increment列,且必须被索引,且不能有default值
- comment注释
- primary key 主键,唯一索引
- key | index 都是索引
- unique不同索引
- fulltext 用于全文搜索
- foreign key 外键
常见的表格选项
表格选项table_option用于优化表的行为
- engine新表的默认存储引擎是innodb,还有myisam(主要用于只读或以读为主),memory(数据存内存)
- character set,collate和comment上面都提过
- tablespace
删除/修改语句和DDL的回滚
删除/修改语句没啥好说的关键词drop/alter
mysql8.0开始支持原子DDL(atomic DDL),即多条原子ddl语句构成的ddl语句,要么全部失败,要么全部成功,目前只有innoDB支持该功能
注意原子DDL并不是事务DDL,任何一条DDL语句,都会隐式结束当前会话中的任何事务,这意味着ddl语句并不能在另一个事务中执行