MySQL数据库进阶(一)
常见的约束条件
not null
unsigned
zerofill
default默认值
# 创建学生信息表
create table student_info(
id int primary key auto_increment,
name varchar(16) not null,
gender enum('female','male') default 'male',
age int,
hobby set('read','write','sleep')
);
insert into student_info values(1,'egon','female',73,'read,sleep');
# 指定字段插入数据
insert into student_info(name,age,hobby) values('jason',18,'read'),('tank',18,'write');
unique唯一键
"""
单列唯一:比如学生的id
联合唯一:比如标识一台计算机上独一无二的应用程序(ip,port)
#action:联合唯一中的元素,单个可以重复,但是联合起来的对象必须是唯一的
"""
- 单列唯一
# 创建课程表
create table course_info(
id int unique,
name varchar(16) not null,
price int not null
);
insert into course_info values(1,'数据分析',28000),(2,'python全栈',20000);
- 联合唯一
# 创建应用程序表
create table application_info(
id int primary key auto_increment,
name varchar(16) not null,
ip varchar(16),
port int,
unique(ip,port)
);
insert into application_info(name,ip,port) values('mysql_129','192.168.80.129',9090),('tomcat_129','192.168.80.129',8080),('mysql_128','192.168.80.128',9090);
primary key主键
"""
1、从约束效果上来看primary key 等价于 (not null+unique)
"""
create table beast_info(
id int primary key auto_increment,
name varchar(32) not null,
gender enum('female','male')
);
"""
2、primary key 是Innodb存储引擎组织数据的依据
# Innodb存储引擎在创建表的时候必须要有primary key
因为它类似于书的目录 能够帮助提示查询效率并且也是建表的依据
"""
(1)一张表有且只有一个主键,如果没有设置主键,Innodb存储引擎会从上往下搜索,直至遇到一个非空且唯一的字段,将其升级为主键
exp:
create table teacher(
id int not null unique,
name varchar(16) not null,
address varchar(32) not null unique
);
"""
3、 如果表中没有主键也没有其他任何的非空且唯一字段 那么Innodb会采用自己内部提供的一个隐藏字段作为主键,隐藏意味着你无法使用到它 就无法提示查询速度
"""
一张表中通常有一个主键字段,通常都是将id、uid、sid作为主键
- 单个主键字段
create table class_info(
id int primary key auto_increment,
name varchar(32) not null,
address varchar(32)
);
insert into class_info(name,address) values('魔都校区','上海'),('紫金校区','南京'),('帝都校区','北京');
- 联合主键字段
create table stu_info(
stu_id int,
stu_name varchar(32),
gender enum('female','male') default 'male',
hobby set('read','sleep'),
primary key(stu_id,stu_name)
);
insert into stu_info(stu_id,stu_name,hobby) values(1,'马林','sleep'),(2,'马林','read');
- auto_increment自增
"""
1、当编号特别多的时候 人为的去维护太麻烦
2、auto_increment通常都是加在主键上的 不能给普通字段加
"""
结论
"""
1、以后在创建表的id(数据的唯一标识id、uid、sid)字段的时候
id int primary key auto_increment
"""
# 补充
delete from t1 删除表中数据后 主键的自增不会停止
truncate t1 清空表数据并且重置主键
表与表之间的关系
表与表之间通常有以下的4种关系:
"""
1、一对多(多对一)
2、多对多关系
3、一对一关系
4、没有关系
"""
我们通过外键来维系(建立)表与表之间的关系
# 外键(foreign key)
外键的作用:
"""
1、使表的组织结构变得清晰
2、节约硬盘空间
3、增强数据的可扩展性
"""
一对多关系
exp:
员工表与部门表
"""
一个部门可以有多个员工,但是一个员工只能有一个部门
员工与部门之间的关系是单向的“一对多”关系
"""
foreign key:
1、一对多表关系,外键字段建在多的一方
2、在创建表的时候,一定要先建被关联表
3、在录入数据的时候,也要先录入被关联表
# 部门表
create table dep_info(
id int primary key auto_increment,
dep_name varchar(32) not null,
dep_desc varchar(32)
);
# 员工表
create table emp_info(
id int primary key auto_increment,
name varchar(32) not null,
gender enum('female','male') default 'male',
dep_id int,
foreign key(dep_id) references dep_info(id)
);
insert into dep_info(dep_name,dep_desc) values('教学部','教书育人'),('技术部','you can you up'),('外交部','多人运动');
insert into emp_info(name,dep_id) values('jason',3),('egon',1),('tank',2);
思考
"""
1、能否修改dep表里面的id字段? 不能
2、能否删除dep表里面的数据? 不能
"""
解决方案:
"""
1、先删除教学部对应的员工数据 之后再删除部门(操作繁琐)
2、使用级联同步更新、同步删除
"""
"""
on update cascade
on delete cascade
"""
# 部门表
create table dep_info(
id int primary key auto_increment,
dep_name varchar(32) not null,
dep_desc varchar(32)
);
# 员工表
create table emp_info(
id int primary key auto_increment,
name varchar(32) not null,
gender enum('female','male') default 'male',
dep_id int,
foreign key(dep_id) references dep_info(id)
on update cascade # 级联更新
on delete cascade # 级联删除
);
多对多关系
exp:
图书表与作者表
"""
一本图书可以有多个作者
一个作者可以有多个著作
图书与作者之间是双向的“一对多”关系
"""
# 需要新建一张表来分别维系(建立)两者的一对多关系,两者并不直接建立关系
"""
book
author
book_link
"""
# 创建书籍表
create table book_info(
book_id int primary key auto_increment,
title varchar(32) not null,
price int
);
# 创建作者表
create table author_info(
author_id int primary key auto_increment,
author_name varchar(32) not null,
age int,
address varchar(32)
);
# 创建联系表
create table book_link_author(
id int primary key auto_increment,
book_id int not null,
author_id int not null,
foreign key(book_id) references book_info(book_id)
on update cascade
on delete cascade,
foreign key(author_id) references author_info(author_id)
on update cascade
on delete cascade
);
insert into book_info(title,price) values('富婆挑战记录',1000),('egon与tank',1024),('雨后情缘',2048);
insert into author_info(author_name,age,address) values('egon',73,'山东'),('jason',18,'虹桥'),('wusir',88,'北京');
insert into book_link_author(book_id,author_id) values(1,1),(1,2),(2,1),(2,3),(3,2),(3,3);
一对一关系
如果一个表的字段特别多 ,每次查询又不是所有的字段都能用得到可以将表一分为二 ,如用户表与用户详情表
"""
一张用户表能否对应多个用户详情表? 不能
一张用户详情表能否对应多张用户表? 不能
"""
# 创建用户详情表
create table user_detail(
id int primary key auto_increment,
name varchar(32),
age int,
gender enum('male','female') default 'male',
address varchar(32)
);
# 创建用户表
create table user(
user_id int primary key auto_increment,
user_account varchar(32) not null,
user_password varchar(32) not null,
user_detail_id int not null,
foreign key(user_detail_id) references user_detail(id)
on update cascade
on delete cascade
);
insert into user_detail(name,age,address) values('egon',78,'山东'),('jason',18,'安徽'),('tank',18,'广东');
insert into user(user_account,user_password,user_detail_id) values('dsb001','sucess',1),('qb002','334256',2),('dsb010','kingstar',3);
总结
表关系的建立需要用到foreign key
一对多
外键字段建在多的一方
多对多
自己开设第三张存储
一对一
建在任意一方都可以 但是推荐你建在查询频率较高的表中
修改表(了解)
mysql对大小写不敏感
- 修改表名
alter table 表名 rename 新表名;
mysql> alter table teacher rename teacher_info;
- 增加字段
alter table 表名 add 字段名 字段类型(宽度) 约束条件;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 first;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 after 字段名;
mysql> alter table student10
-> add name varchar(20) not null,
-> add age int(3) not null default 22;
mysql> alter table student10
-> add stu_num varchar(10) not null after name; //添加name字段之后
mysql> alter table student10
-> add sex enum('male','female') default 'male' first; //添加到最前面
- 删除字段
alter table 表名 drop 字段名;
mysql> alter table student10
-> drop sex;
mysql> alter table service
-> drop mac;
- 修改字段
alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
mysql> alter table student10
-> modify age int(3);
mysql> alter table student10
-> modify id int(11) not null primary key auto_increment; //修改为主键
alter table 表名 change 旧字段名 新字段名 字段类型(宽度) 约束条件;
复制表(了解)
- 复制表结构+记录(key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;
- 只复制表结构
mysql> select * from service where 1=2; //条件为假,查不到任何记录
Empty set (0.00 sec)
mysql> create table new1_service select * from service where 1=2;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> create table t4 like employees;
删除表
DROP TABLE 表名;
mysql> drop table user;