MySQL之Foregin_Key
一\一对多
一.员工表和部门表
dep emp
类似与我们将所有的代码都写在一个py文件内
确立标语表之间的关系
思路:一定要要换位思考问题(必须两方都考虑周全之后才能得出结论)
思路:一定要要换位思考问题(必须两方都考虑周全之后才能得出结论)
1.先站在部门表中看能否有多个部门对应一个员工
1.先站在部门表中看能否有多个部门对应一个员工 翻译过来就是:一个员工能否有多个部门 很显然不可以!!! 在站在员工表中看能否有多个员工对应一个部门 翻译过来: 很显然是可以的!!! 所以员工表和部门表之间仅仅打火机单向事务多对一 他们的表关系就是"一对多" 表关系中没有"多对一"的说法,都是"一对多"
让两个表代码层面上的真正的关联,就是必须使用外键
2,让两个表代码层面上的真正的关联,就是必须使用外键 什么是外键呢>>> 让表与表之间有硬性关系 foreign key 注意这里是没有下滑线的 foreign key 外键约束 1.在创建表的时候,必须先创建被关联系 2.插入数据的时候 也必须先插入被关联表的数据
建表# 被关联
create table dep(id int primary key auto_increment, dep_name varchar(32), dep_desc varchar(128));
在建 关联表 注意加级联级删除(同事更新,更新的是直接关联的表)
emp_name varchar(32), emp_gender enum("male","female","other") default "male", dep_id int, foreign key(dep_id) references dep(id) on update cascade on delete cascade);
# 注意的是的外键是一个完整的语句 关联的是所在表的外键id
应用到真正关联的表.级联级更新级联删除
插入数据 先插入被关联的表的具体数据 id 是自动自增所以不用添加
insert into dep(dep_name,dep_desc_) values('教学部','教书育人'), ('技术部','技术部门'), ('外交部','形象大使');
# 注意:表字段要写好细节
# 插入具体值到关联表
insert into emp(emp_name,emp_gender,dep_id) values( 'koko','male',1), ('jason','male',2), ('tank','female',3), ('egon','male',3);l
二\多对多
多对多 思路:换为思考
如:书籍和作者 1.先站在书籍的角度看问题 多本书能否被一个作者写 # 翻译一个作者能否写多本书 很显然是可以的>>>一对多 2.再站在书籍的角度看问题 多个作者能否同写一本书 一本书能否被多个作者写 很显然也是可以的>>>一对多 综合上述 多对多 # 注意:多对多需要建立第三张关联书籍和作者的这两张表 确定好关系之后开始建表 所以建表的时候么有要求先建立那张表
建表:
书籍表
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);
# 多对多关系的建立 必须手动创建第三张关联表
reate table book2author(id int primary key auto_increment, book_id int, foreign key(book_id) references book(id) on update cascade on delete cascade, author_id int, foreign key (author_id) references author(id) on update cascade on delete cascade); # 注意完整的一句话哈
#开始在表中插入数据
insert into author(name,age) values('koko',18),('mye',20), ('tank',28);
# 插入第三张表的关联数据
insert into book2author(book_id,author_id) values(1,2),(1,3),(2,1),(2,2),(3,2);
三\一对一
这个很简单的吧 就是把一个人的一张表拆分成两张表
节省内存 和查询的效率问题
一般foreign key 建在查询的比较多的一方
比如一个人的信息表
# 还是先建立被关联的表
create table authordetail(id int primary key auto_increment,
phone int ,
addr varchar(255));
# 注意:括号 完整性
# 关联表 注意唯一性 unique
create table author1(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);
# 插入数据
# 先插被关联表也就是详情表
insert into authordetail(phone,addr) values
(131,'广西'),
('132','东莞'),
(133,'山西');
# 再插入主关联表
insert into author1(name,age,authordetail_id) values
('koko',18,1),
('tank',20,2),
('jason',20,3);
四\总结语法
判断表关系的最简单的语法
图书与出版社
一本书可不可以有多个出版社 不可以!!!
一个出版社可不可以出版多本书 可以!!!
一对多的关系
图书与作者表
一本书可不可以有多个作者 可以!!!
一个作者可不可以写多本书 可以!!!
多对多的关系
作者与作者详情
一个作者可不可以有多个详情 不可以!!!
一个作者详情可不可以有多个作者 不可以!!!
要么两者是一对一
要么两者之间没任何关系
五\了解知识点:
1.修改表的完整语句 1. 修改表名 ALTER TABLE 表名 RENAME 新表名; 2. 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 直接移到最前面 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 寻找插哪个字段的后面 3. 删除字段 ALTER TABLE 表名 DROP 字段名; 4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以! ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
# 查询语句执行的结果也是一张表,可以看成虚拟表 # 复制表结构+记录 (key不会复制: 主键、外键和索引) create table new_service select * from service; # 只复制表结构 select * from service where 1=2; //条件为假,查不到任何记录 create table new1_service select * from service where 1=2; create table t4 like employees;
七\作业
练习:账号信息表,用户组,主机表,主机组
#用户表 create table user( id int not null unique auto_increment, username varchar(20) not null, password varchar(50) not null, primary key(username,password) ); #用户组表 create table usergroup( id int primary key auto_increment, groupname varchar(20) not null unique ); #主机表 create table host( id int primary key auto_increment, ip char(15) not null unique default '127.0.0.1' ); #业务线表 create table business( id int primary key auto_increment, business varchar(20) not null unique ); #建关系:user与usergroup create table user2usergroup( id int not null unique auto_increment, user_id int not null, group_id int not null, primary key(user_id,group_id), foreign key(user_id) references user(id), foreign key(group_id) references usergroup(id) ); #建关系:host与business create table host2business( id int not null unique auto_increment, host_id int not null, business_id int not null, primary key(host_id,business_id), foreign key(host_id) references host(id), foreign key(business_id) references business(id) ); #建关系:user与host create table user2host( id int not null unique auto_increment, user_id int not null, host_id int not null, primary key(user_id,host_id), foreign key(user_id) references user(id), foreign key(host_id) references host(id) );
练习:
# 班级表 cid caption # 学生表 sid sname gender class_id # 老师表 tid tname # 课程表 cid cname teacher_id # 成绩表 sid student_id course_id number