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  # 同步删除
)

原文地址:https://www.cnblogs.com/bailongcaptain/p/12833916.html