存储引擎 engines
MySQL中数据以各种不同的技术存储在文件(或者内存)中,使用不同的存储引擎,数据存储的方式是不同的
show engines; 查看存储引擎
create table 表名(结构) engine = 引擎名; 指定存储引擎
show create table 表名; 查看建表语句
innodb
在数据库中以两个文件(表结构+数据)的方式存在,是MySQL5.6以上默认的存储方式
transaction 事务 保证数据安全、数据的完整性而设置的概念 事务里的命令要么一起成功,要么一起失败
row-level locking 行级锁 给行上锁
table-level locking 表级锁 给表上锁
foreign keys 外键约束 为了逻辑性,约束后有关联的两个表不可删改
树 tree 加速查询 树形结构(数据 + 树)+ 表结构
用于事务处理应用程序,支持外键和行级锁。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,
数据操作除了插入和查询之外,还包括很多更新和删除操作,那么InnoDB存储引擎是比较合适的。
InnoDB除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择
myisam
在数据库中以三个文件(结构+数据+索引)的方式存在,是MySQL5.5以下默认的存储方式
table-level locking 表级锁
数 tree 加速查询 树形结构 + 数据 + 表结构
如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,
并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。
memory
在数据库中以一个文件的方式存在,基于hash
MySQL中的常用数据类型
数值
MySQL支持所有标准SQL数值数据类型。
这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
类型 | 大小 | 范围(有符号) | 范围(无符号)unsigned约束 | 用途 |
TINYINT | 1字节 | (-127,127) | (0,255) | 小整数值 |
INT或INTEGER | 4字节 | (-231,231) | (0,232) | 大整数值 |
FLOAT | 4字节 | 单精度浮点数值 | ||
DOUBLE | 8字节 | 双精度浮点数值 |
create table int_t(ti tinyint,tiun tinyint unsigned); 创建int_t表,表中字段tiun被约束无符号
float(5,2) 逗号前数字代表这个float一共有多少位,逗号后的数字代表小数点后有多少位
double精度比float高,但也并不准确
float和double都会在精确位四舍五入
时间
类型 | 用途 | 格式 | 举例 |
DATETIME | 年月日时分秒 | YYYY-MM-DD HH:MM:SS | 打卡时间、日志 |
DATE | 年月日 | YYYY-MM-DD | 生日 |
TIME | 时分秒 | HH:MM:SS | 规定上班时间 |
YEAR | 年份 | YYYY | 年份相关 |
TIMESTAMP | 年月日时分秒(时间戳) | YYYYMMDD HHMMSS | 时间戳由于表示范围的问题,现在使用的少了 |
insert into time_t(dt) values(now()); 给表time_t里的dt字段添加现在的时间(now()是默认值 当前时间)
每次修改与timestamp一行的表中内容时,timestamp在那一行中的时间也更新
datetime可以表示的范围比timestamp更大,如果想让datetime拥有timestamp的特质,就通过 show create table 表名 查看时间戳的建表语言,并copy到datetime字建表段后
字符串
类型 | 范围 | 特点 |
CHAR | 0-255个字符 | 定长存储,存储速度更快,占用更多空间,以空间换时间 |
VARCHAR | 0-65535个字符 | 变长存储,存储速度相对慢,占用空间小,以时间换空间 |
char(12) 添加'alex' 添加时会自动变为 'alex ' 总12的长度 空间换时间
varchar(12) 添加'alex' 添加时会自动变为 'alex4' 总5的长度 时间换空间
enum和set
enum:单选,建表后只能在enum()里有限的条件中选一个字段
set:多选,建表后能在enum()里有限的条件中选多个字段
MySQL中的表的约束
所有的约束都是建表时堆在每个字段后
not null
非空约束 如果非空约束失败,可以通过设置严格模式使其生效
设置严格模式: 不支持对not null字段插入null值 不支持对自增长字段插入”值 不支持text字段有默认值 直接在mysql中生效(重启失效): mysql>set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"; 配置文件添加(永久失效): sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
default
设置默认值
unique
唯一约束,约束一列内容不能重复
unique(字段,字段,...)
联合唯一约束 被约束的字段同时重复才算重复
primary key
主键,一张表只能有一个主键 如果一张表中没有设置主键,那么第一个设置非空+唯一的字段会被设置为主键
primary(字段,字段,...) 或 字段已设置not null,然后unique(字段,字段,...)
联合主键
auto_increment
自动增长 被约束的字段可以不是主键,自带not null属性,只能操作数字,只能对unique字段设置,不受删除影响
foreign key
外键约束 约束的字段至少是unique,推荐约束主键 约束方法:foreign key(字段) references 约束表名(字段) on delete cascade(级联删除) on update cascade(级联更新)
表与表的关系
一对多
校区表(校区id,城市...)和班级表(班级id,课程...)
一个校区可以有多个班级(一对多),一个班级只能在一个校区
建立关系的方法
多 (foreign key) 关联 一 表
班级表创建foreign key关联校区表的校区id字段
多对多
学生表(学生id,姓名...)和班级表(班级id,课程...)
一个学生可以报多个班级(一对多) 一个班级可以有多个学生(一对多)
建立关系的方法
产生第三张表
一个字段外键关联一个表的主键,一个字段外键关联另一个表的主键
一对一
学生表(学生id,姓名...)和客户表(客户id,电话号...)
一个客户对应一个学生(一对一)
建立关系的方法
学生表的gid foreign key 关联客户表的主键id
且gid一定被设置为unique