2.MySQL数据库简介
本文最后更新于:2021年10月1日 晚上
MySQL数据库简介
数据库控制
命令行操作数据库
1 |
|
show 命令
1 |
|
数据库表的列类型
数值类型
int(M)
:M指示最大显示宽度。显示宽度与存储大小或类似所包含值的范围无关
字符串类型
日期和时间型类型
NULL值
- 理解为 “没有值” 或 “未知值”
- 不要用NULL进行算术运算 , 结果仍为NULL
数据库表的字段属性
UnSigned
- 无符号的
- 声明该数据列不允许负数 .
ZEROFILL
- 0填充的
- 不足位数的用0来填充 , 如int(3),5则为005
Auto_InCrement
-
自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)
-
通常用于设置主键 , 且为整数类型
-
可定义起始值和步长
-
- 当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表
- SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)
NULL 和 NOT NULL
- 默认为NULL , 即该列允许为空
- 如果设置为NOT NULL , 则该列必须有值
DEFAULT
- 用于设置默认值
- 例如,性别字段,默认为"男" , 否则为 “女” ; 若无指定该列的值 , 则默认值为"男"的值
拓展:阿里云项目数据库规范
每一个表都要有这几个字段
1
2
3
4
5id 主键
version 乐观锁
is_delete 伪删除
gmt_create 创建时间
gmt_update 修改时间
数据库表的引擎
默认使用 INNODB
功能 | InnoDB | MYISAM | Memory | Archive |
---|---|---|---|---|
存储限制 | 64TB | 256TB | RAM | None |
支持事务[1] | Y | N | N | N |
支持全文索引[2] | N | Y | N | |
支持哈希索引 | N | N | Y | N |
支持数据缓存 | Y | N | N/A | N |
支持外键 | Y | N | N | N |
- 选择策略:
- 如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
- 如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
- 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎
- MySQL中使用该引擎作为临时表,存放查询的中间结果
- 如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。
- Archive非常适合存储归档数据,如记录日志信息可以使用Archive
数据库表的在物理空间的位置
-
MySQL数据表以文件方式存放在磁盘中
-
- 包括表文件 , 数据文件 , 以及数据库的选项文件
- 位置 : Mysql安装目录
\data\
下存放数据表 . 目录名对应数据库名 , 该目录下文件名对应数据表
-
文件类型:
*.frm
:存储表的列信息(表的结构)*.MYD
:数据文件*.MYI
:索引文件*.ibd
:数据+索引
-
具体文件介绍
文件结构名称 作用 ibdata1 系统数据字典信息(元数据信息),undo表空间数据 ib_logfiel0~ib_logfile1 REDO日志文件,事务日志文件 ibtmp1 临时表空间磁盘位置,存储临时表 ibdata1存储所有InnoDB引擎的表的元信息和undo信息
各个表.idb文件存储自己的数据行和索引信息
-
一张InnoDB表由一个
*.frm
文件 、一个*.idb
文件, 以及上一级目录的ibdata1
文件;一张MyISAM表由
.frm
、MYD
、MYI
组成
数据库表的字符集
我们可为数据库,数据表,数据列设定不同的字符集,设定方法 :
-
创建时通过命令来设置 , 如 :
CREATE TABLE 表名()CHARSET = utf8;
-
如无设定 , 则根据MySQL数据库配置文件
my.ini
中的参数设定1
character-set-server=utf8
不建修改配置文件,这样会导致sql语句的移植性降低
数据库表的外键(了解)
概念
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。
由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。
引用别人的表——主表;
被别人引用的表——从表;
作用
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据约束,使两张表形成关联。
主表中的外键只能引用外表中的对应列的值或使用空值。
MySQL命令操作
-
创建外键
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24-- 创建外键的方式一 : 创建子表同时创建外键
-- 年级表 (id\年级名称)
CREATE TABLE `grade` (
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
PRIMARY KEY (`gradeid`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
-- 学生信息表 (学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号)
CREATE TABLE `student` (
`studentno` INT(4) NOT NULL COMMENT '学号',
`studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`sex` TINYINT(1) DEFAULT '1' COMMENT '性别',
`gradeid` INT(10) DEFAULT NULL COMMENT '年级',
PRIMARY KEY (`studentno`),
KEY `FK_gradeid` (`gradeid`), -- 定义外键key
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`) -- 给外键添加约束(执行引用)
) ENGINE=INNODB DEFAULT CHARSET=utf8
--------------------------------------------
-- 创建外键方式二 : 创建子表完毕后,修改子表字段 添加外键约束
ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`); -
删除外键
1
2
3
4
5-- 删除外键
ALTER TABLE student DROP FOREIGN KEY FK_gradeid;
-- 发现执行完上面的,索引还在,所以还要删除索引
-- 注:这个索引是建立外键的时候默认生成的
ALTER TABLE student DROP INDEX FK_gradeid;- 删除具有主外键关系的表时 , 要先删子表 , 后删主表
以上操作都是物理外键、数据库级别的外键,不建议使用
- 原因:对于数据库的所有外键的每次插入、更新和删除后,数据库服务器进行完整性检查是一个耗费时间和资源的过程,它可能影响性能
最佳实践
- 数据库就是单纯的表,只用来存数据,只有行、列
- 我们想使用多张表,想使用外键,可以使用程序实现(联合查询)
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!