MySQL进阶part2
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL进阶part2相关的知识,希望对你有一定的参考价值。
unique——唯一
# 单列唯一
create table t3(
id int unique,
name char(16)
);
insert into t3 values(1,‘jason‘),(1,‘egon‘);
insert into t3 values(1,‘jason‘),(2,‘egon‘);
# 联合唯一(两个分开都可以重复 但是加载一起必须是唯一的)
create table t4(
id int,
ip char(16),
port int,
unique(ip,port)
);
insert into t4 values(1,‘127.0.0.1‘,8080);
insert into t4 values(2,‘127.0.0.1‘,8081);
insert into t4 values(3,‘127.0.0.2‘,8080);
insert into t4 values(4,‘127.0.0.1‘,8080); 报错
primary key 主键(非空切唯一)
create table t5(id int primary key);
insert into t5 values(null); # 错误
insert into t5 values(1),(1); # 重复错误
insert into t5 values(1),(2);
ps:在创建表的时候id字段一定要加primary key
auto_increment(自增)
# 编号太多的情况下适用
create table t8(
id int primary key aotu_increment,
name char(16)
);
ps:
在创建表的时候id字段一定要加primary key aotu_increment
delete 删除表中的数据之后 主键的自增不会归零
truncate t8 可以清空数据,并且重置主键
表和表之间的关系
问题:在一张员工信息表中 有许多字段
id name gender dep_name dep_desc
如何优化其扩展性
解决方案——拆分
外键
帮助我们建立表与表之间的关系
foreign key
表的关系
1.一对多
2.多对多
3.一对一
4.无关
ps:如何判断两张表的关系
?
换位思考——站在两张表的角度思考
?
员工表与部门表为例
先站在员工表
思考一个员工能否对应多个部门(一条员工数据能否对应多条部门数据)
不能!!!
(不能直接得出结论 一定要两张表都考虑完全)
再站在部门表
思考一个部门能否对应多个员工(一个部门数据能否对应多条员工数据)
能!!!
得出结论
员工表与部门表示单向的一对多
所以表关系就是一对多
-
一对多关系
foreign key
1.外键字段建立在多的一方(使用的次数多)
2.在创建时期 先创建被关联的表
3.录入数据时期 也录入被关联的表
# 先创被关联的表
create table dep(
id int primary key aotu_increment,
dep_name char(16),
dep_desc char(32)
);
?
# 再创关联表
create table emp(
id int primary key aotu_increment,
name char(16),
gender enum(‘male‘,‘famale‘) default‘male‘,
foreign key(dep_id) referrences dep(id)
);
?
# 先录入被关联的表
insert into dep(dep_name,dep_desc) values(‘sb教学部‘,‘教书育人‘),(‘外交部‘,‘多人外交‘),(‘nb技术部‘,‘技术能力有限部门‘);
# 再录入员工表
insert into emp(name,dep_id) values(‘jason‘,2),(‘egon‘,1),(‘tank‘,1),(‘kevin‘,3);
ps:在关联了表关系之后,不可以修改被关联的数据的字段
如需要修改,需要先删除被关联数据(教学部)对应的数据(教学部的员工数据)再删除部门数据。
级联更新 >>> 同步更新 级联删除 >>> 同步删除
create table dep(
id int primary key auto_increment,
dep_name char(16),
dep_desc char(32)
);
create table emp(
id int primary key auto_increment,
name char(16),
gender enum(‘male‘,‘female‘,‘others‘) default ‘male‘,
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade # 同步更新
on delete cascade # 同步删除
);
insert into dep(dep_name,dep_desc) values(‘sb教学部‘,‘教书育人‘),(‘外交部‘,‘多人外交‘),(‘nb技术部‘,‘技术能力有限部门‘);
insert into emp(name,dep_id) values(‘jason‘,2),(‘egon‘,1),(‘tank‘,1),(‘kevin‘,3);
-
多对多关系
# 图书和作者表
create table book(
id int primary key aotu_increment,
title varchar(16),
price int,
author_id int,
foreign key(author_id) references author(id)
on updata cascade
on delete cascade
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int,
book_id int,
foreign key(book_id) references book(id)
on update cascade # 同步更新
on delete cascade # 同步删除
);
"""
按照上述的方式创建 一个都别想成功!!!
其实我们只是想记录书籍和作者的关系
针对多对多字段表关系 不能在两张原有的表中创建外键
需要你单独再开设一张 专门用来存储两张表数据之间的关系
"""
create table book(
id int primary key auto_increment,
title varchar(32),
price int
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int
);
create table book2author(
id int primary key auto_increment,
author_id int,
book_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 # 同步删除
);
-
一对一关系
"""
id name age addr phone hobby email........
如果一个表的字段特别多 每次查询又不是所有的字段都能用得到
将表一分为二
用户表
用户表
id name age
用户详情表
id addr phone hobby email........
站在用户表
一个用户能否对应多个用户详情 不能!!!
站在详情表
一个详情能否属于多个用户 不能!!!
结论:单向的一对多都不成立 那么这个时候两者之间的表关系
就是一对一
或者没有关系(好判断)
?
客户表和学生表
在你们报名之前你们是客户端
报名之后是学生(期间有一些客户不会报名)
"""
?
一对一 外键字段建在任意一方都可以 但是推荐你建在查询频率比较高的表中
create table authordetail(
id int primary key auto_increment,
phone int,
addr varchar(64)
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int,
authordetail_id int unique, # 唯一
foreign key(authordetail_id) references authordetail(id)
on update cascade # 同步更新
on delete cascade # 同步删除
)
以上是关于MySQL进阶part2的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情