数据库表操作
存储引擎
引擎: 存储数据的方式,不同的存储方式会影响存取效率
常用存储引擎: Innodb myisam memory blackhole
Innodb: 支持事务,行级锁,外键
myisam: 支持表级锁
memory: 内存级别的存储引擎,相当于缓存的作用,存取速度快,不能完成数据的持久化存储,重启mysql之后,表中的数据就会消失,适用于断电即消失的数据,或者存储一些效率要求比较高的,丢失不要紧的数据
一般会把所有的视频都以Innodb存储引擎的方式存在硬盘里,然后把经常被点击的热数据放到memory存储引擎中再存一次,存储到内存中,方便经常查看.
blackhole: 黑洞,读写分离,所有数据都可以写入,但是都不会真的记录在表当中,主从多级复制
事务: n句sql是一个完整的事件,这n句sql要么一起成功,要么一起失败
行级锁: 能够支持更多的修改数据的并发操作,当修改的行数非常多的时候,效率也会受到影响
表级锁: 不能支持并发的修改同一张表中的数据,不需要加很多细粒度的锁来浪费时间
外键: 在本表中有一个字段关联外表中的另一个字段
创建表
use 库名 #首先切换到数据库内 create table 表名 (字段名 数据类型(宽度) 约束条件); # 创建表 create table t1 (id int,name char(10));
注意:
1.在同一张表中,字段名不能相同
2.宽度和约束条件可选择不写
3.字段名和类型必须写
查看表结构
desc/describe 表名; #查看表的基础信息 show create table 表名 \G; #查看表的详细信息(编码和存储引擎)
基础数据类型
数字
整数 int(宽度) 对整数约束宽度其实并没有实际的效果,比如设置宽度为5,约束只是在不足长度的时候的显示宽度是5,而不是你只能存储5位数
小数 float(n,m) n表示数据总长度,m表示小数位
时间类型
year
date
time
datetime
timestamp #不允许为空,默认值是当前时间 now(),能够表示的时间范围比较小(1970--2038),超出这个时间范围则表示为0000--00-00 00:00:00,如果同一个表中有两个该字段,只有第一个字段会被表示为默认当前时间
字符串
char(宽度) 定长 存储相对浪费空间(不足产股的时候会自动补齐长度进行存储),不管存储什么样的数据,在显示的时候都会把数据的空格去掉
varchar(宽度) 变长 相对节省空间,存取效率相对慢
应用:
char 手机号 身份证号 有限的长度
varchar 评论 备注
enum和set
enum 枚举 单选 不能选择不在枚举范围内的. 在严格模式下,如果写入不在枚举范围内的内容会报错
set 集合 多选 去重 当重复选择集合当中的选项时,只会显示一个 不能选择不在集合范围内的内容
#创建一个表t1 mysql> create table t1 (id int,name char(10),gender enum('male','female')); Query OK, 0 rows affected (1.87 sec) #向表内添加数据,当性别不在指定枚举范围内,报错 mysql> insert into t1 values (1,'alex','unknown'); ERROR 1265 (01000): Data truncated for column 'gender' at row 1 #写入枚举范围内的选项,并查看写入之后的表 mysql> insert into t1 values (1,'alex','male'); Query OK, 1 row affected (0.39 sec) mysql> select * from t1; +------+------+--------+ | id | name | gender | +------+------+--------+ | 1 | alex | male | +------+------+--------+ 1 row in set (0.00 sec)
表的完整性约束
not null 非空
unique 唯一
primary key 主键 =非空+唯一 一张表只能有一个或一组主键
default 默认值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#创建表t2,id为主键,年龄默认值为20 mysql> create table t2 (id int primary key,name char(10) not null,age int default 20); Query OK, 0 rows affected (1.61 sec) # 指定要输入的字段,让年龄使用默认值 mysql> insert into t2 (id,name) values (1,'taibai'); Query OK, 1 row affected (0.10 sec) #查看表中的内容 mysql> select * from t2; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | taibai | 20 | +----+--------+------+ 1 row in set (0.00 sec) #更改默认值并查看内容 mysql> insert into t2 values (2,'taibai',25); Query OK, 1 row affected (0.36 sec) mysql> select * from t2; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | taibai | 20 | | 2 | taibai | 25 | +----+--------+------+ 2 rows in set (0.00 sec)
unique(字段1,字段2) 联合唯一
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
mysql> create table t3 (id int,name char(10) not null,phone char(11),unique(id,phone)); Query OK, 0 rows affected (1.99 sec)
foreign key 外键
on update cascade 级连更新
on delete cascade 级连删除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 创建记录班级信息的表t4,写入数据 mysql> create table t4_class (id int primary key,name char(10)); Query OK, 0 rows affected (1.78 sec) mysql> insert into t4_class values (1,'python'),(2,'java'); Query OK, 2 rows affected (0.35 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from t4_class; +----+--------+ | id | name | +----+--------+ | 1 | python | | 2 | java | +----+--------+ 2 rows in set (0.00 sec) # 创建记录学生信息的表t5,指定外键,与t4中的id字段相关联 mysql> create table t5_student (id int primary key,name char(10) not null,cls_id int,foreign key(cls_id) references t4_class(id) on delete cascade on update cascade); Query OK, 0 rows affected (0.26 sec) mysql> insert into t5_student values (1,'alex',1); Query OK, 1 row affected (0.11 sec) mysql> select * from t5_student; +----+------+--------+ | id | name | cls_id | +----+------+--------+ | 1 | alex | 1 | +----+------+--------+ 1 row in set (0.00 sec)
auto_increment 自动增长 被约束的字段必须是int类型且唯一
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 创建表t6,id为主键且设置为自动增长 mysql> create table t6 (id int primary key auto_increment,name char(10),age int); Query OK, 0 rows affected (3.06 sec) mysql> insert into t6 (name,age) values ('alex',20),('wusir',21),('taibai',22); Query OK, 3 rows affected (0.11 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from t6; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | alex | 20 | | 2 | wusir | 21 | | 3 | taibai | 22 | +----+--------+------+ 3 rows in set (0.00 sec)
修改表结构
修改表名 alter table 表名 rename 新表名; 增加字段 alter table 表名 add 字段名 数据类型 约束条件,add 字段名 数据类型 约束条件; 删除字段 alter table 表名 drop 字段名; 修改字段 alter table 表名 modify 字段名 数据类型 约束条件; #修改数据类型和约束 alter table 表名 change 旧字段名 新字段名 数据类型 约束条件; 修改字段排列顺序/在增加的时候指定字段位置 alter table 表名 add 字段名 数据类型 约束条件 first; alter table 表名 add 字段名 数据类型 约束条件 after 字段名; alter table 表名 change 字段名 旧字段名 新字段名 新数据类型 约束条件 first; alter table 表名 modify 字段名 数据类型 约束条件 after 字段名;
表与表之间的关系
一对一: b表中有一个字段是 unique且是a表中某一个字段的Foreign key
站在A表的角度上看一条数据是不是和b表中的一条数据关联
站在B表的角度上看一条数据是不是和a表中的一条数据关联
一对多: Foreign key
站在A表的角度上看一条数据是不是和b表中的一条数据关联
站在B表的角度上看一条数据是不是和A表中的多条数据关联
多对多: 建立c表,有一个字段是a表的Foreign key,还有一个字段是b表的Foreign key
站在A表的角度上看一条数据是不是和b表中的多条数据关联
站在B表的角度上看一条数据是不是和A表中的多条数据关联