点击蓝字 关注我们
char与varchar对比
char(4)
不超过4个字符 还是存四个字符(空格填充)
varchar(4)
不超过4个字符 有几个存几个
char
优点:整存整取 不会出现数据错乱 速度快
缺点:浪费存储空间
varchar
优点:节省存储空间
缺点:存取数据的速度较于char偏慢
到底使用char还是varchar?
其实二者都有应用场景
一般情况下推荐使用varchar
但是具体结合实际需求(产品经理 架构师...)
枚举与集合类型

枚举
多选一
create table user1(
id int,
name varchar(16),
gender enum('male','female','others')
);
# 列举可以写入的数据 不在范围之内直接报错(严格模式)
集合
多选多(包括多选一)
create table user2(
id int,
name varchar(16),
hobby set('read','study','run','ball')
);
·新日期类型·
datetime 年月日时分秒
date 年月日
time 时分秒
year 年
create table user3(
id int,
name varchar(16),
reg_time datetime,
birthday date,
study_time time,
stime year
);
# 我们在录入时间数据的时候 其实都是直接借助于获取时间的模块
# 只做模拟演示 自己写时间
insert into user3 values(1,'jason','2000-11-11 11:11:11',
'1995-01-21','12:30:00','2020');
创建表的完整语法
create table 表名(
字段名1 字段类型(宽度 约束条件),
字段名2 字段类型(宽度 约束条件),
字段名3 字段类型(宽度 约束条件)
);
1.字段名和字段类型是必须的 宽度和约束条件是可选的
2.约束条件可以有多个!!!
3.最后一个字段结尾不要加逗号
约束条件

1.unsigned 无符号
create table t1(id tinyint);
create table t2(id tinyint unsigned);
insert into t1 values(255);
insert into t2 values(255);
2.zerofill 0填充
create table t3(id tinyint zerofill);
insert into t3 values(1);
3.not null 非空
create table t4(name varchar(16) not null);
insert t4 values(); # 报错 必须给个值
insert t4 values(''); # 不报错
4.default 默认值
create table t5(
name varchar(16),
gender varchar(16) default 'male'
);
"""
在插入数据的时候也可以指定字段 不指定默认就是按照顺序依次传值
insert into t5(name) values(值)
"""
##### 复杂 #####
5.unique 唯一
# 单列唯一
create table t6(
id int,
name varchar(16) unique
);
insert into t6(id,name) values(1,'jason'),(2,'jason');
# 多列唯一(联合唯一)
create table t7(
id int,
host varchar(16),
port int,
unique (host,port)
);
insert into t7 values(1,'127.0.0.1',8080),(2,'127.0.0.2',8080),
(3,'127.0.0.1',8080);
6.primary key 主键
特点:1.主键在约束条件上相当于是not null + unique(非空且唯一)
# 单列主键
create table t8(
id int primary key # id int not null unique
);
# 多列主键(联合主键) 本质还是一个主键 并且这种情况使用较少
create table t9(
ip char(16),
port int,
primary key(ip,port)
);
2.由于5.6及之后的版本存储引擎都是InnoDB
该引擎规定了所有的表都必须有且只有一个主键
'''1.没有设置主键也没有其他约束条件'''
InnoDB为了能够创建出表 会自动采取内部隐藏的字段作为主键
隐藏意味我们无法使用到该主键 是没有意义的!!!
'''2.没有设置主键但是有其他约束条件'''
InnoDB会自上而下的将一个非空且唯一的字段升级为主键使用
create table t12(
id int,
name char(16),
age int not null unique,
addr char(16) not null unique
);
字段将age升级为主键
总结:以后我们在创建表的时候一定要自己指定主键
并且主键一般都是序号 用来唯一标识数据
所以主键一般情况下都是设置给表中的第一个id字段
uid sid pid cid只要是用来标识数据唯一性即可
7.auto_increment 自增
是专门用来给主键使用的 目的就是让主键能够自己增加不需要人为数数
create table t13(
id int primary key auto_increment,
name char(16)
);
insert into t13(name) values('jason'),('kevin'),('tony');
以后创建表的时候固定写序号字段
create table t1(
id int primary key auto_increment,
....
);
在写入数据的时候也不需要考虑主键字段了
生命在于运动

外键也属于约束条件 但是功能是用来建立表与表之间的关系
属于特殊的约束条件
# 前戏
创建一张公司里面的员工表
id name age dep_name dep_desc
缺陷:
1.表含义不明确(可以忽略)
2.数据存在重复浪费存储空间(可以忽略)
3.数据修改极其繁琐 不便于扩展(不能忽略)
措施:
将员工表一分为二
员工表
id name age
部门表
id dep_name dep_desc
外键字段(关系字段)的由来
部门编号 对应的就是部门表里面的主键字段
表关系
1.一对多关系
2.多对多关系
3.一对一关系
4.没有关系
# 表关系判断 遵循"换位思考"原则即可
员工表与部门表为例
1.先站在员工表
问:一个员工能否对应多个部门
结论:不可以
2.再站在部门表
问:一个部门能否对应多个员工
结论:可以
总结:一个可以一个不可以 那么这种关系就是"一对多"
create table emp(
id int primary key auto_increment,
name char(16),
gender enum('male','female') not null default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
);
create table dep(
id int primary key auto_increment,
dep_name char(10),
dep_comment char(60)
);
# 基于换位思考得出员工表与部门表是一对多的外键关系
"""
针对一对多的外键关系
关系字段建在多的一方(员工表就是多)
"""
外键约束
1.在创建表的时候需要先创建被关联表
简单理解:先创建没有外键字段的表再创建有外键字段的表
2.在第一次录入数据的时候需要先录入被关联表之后再录入关联表
简单理解:先录入没有外键字段的表再录入有外键字段的表
3.涉及到编辑和删除操作
修改数据
# 修改部门编号 不行
# 删除部门数据 不行
"""针对关系字段的修改与删除如何解决"""
级联更新 级联删除
create table dep1(
id int primary key auto_increment,
dep_name char(10),
dep_comment char(60)
);
create table emp1(
id int primary key auto_increment,
name char(16),
gender enum('male','female') not null default 'male',
dep_id int,
foreign key(dep_id) references dep1(id)
on update cascade
on delete cascade # 这三句为一句 没有逗号
);
多对多关系

以图书表与作者表为例
1.先站在图书表的角度
问:一本书能否对应多个作者
结论:可以
2.再站在作者表的角度
问:一名作者能否对应多本书
结论:可以
结论:两边都可以 那么表关系就是"多对多"
# SQL实现(先写基础的字段 之后再添加外键字段)
create table book(
id int primary key auto_increment,
title varchar(32),
price float(8,2)
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int
);
"""针对多对多关系
外键字段不能直接建在关系表中
需要再额外创建一张专门用来存储关系的第三张表
"""
create table book2author(
id int primary key auto_increment,
book_id int,
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);
一对一关系
以用户表与用户详情表为例
1.先站在用户表角度
问:一个用户能否对应多个用户详情
结论:不可以
2.再站在用户详情表
问:一个用户详情能否对应多个用户
结论:不可以
总结:两个都不可以 那么表关系就是"一对一关系"(没有关系的话直接就能看出来)
"""针对一对一表关系
外键字段建在任何一方都可以,推荐建在查询频率较高的表中
"""
create table user(
id int primary key auto_increment,
addr varchar(32),
age int,
user_detail_id int unique,
foreign key(user_detail_id) references user_detail(id)
on update cascade
on delete cascade
);
create table user_detail(
id int primary key auto_increment,
addr varchar(32),
phone bigint
);





