问题:下列这张表中部门等列名下输入的数据没有约束,那么可以随便填写符合规则的数据但是不符合实际需求的值,这样就造成了不符合规则的数据在表中存在,外键就是为了解决这个问题,管理员可以在另一张表中设置好符合规则的数据,然后让其他的表调用,又比如一个部门改名了,如果这个表中有几百行数据,相同的也有几百行,那么一行一行的修改时非常耗时和没有工作效率的,为了解决这个问题,就要引用外表的数据,这样只要修改外表的一个数据,就可以同步到数据表中
外键实例(一对多)
PS:比如一个人只能在一个部门,而一个部门可以有多个人,这样的关系就是一对多
需求:能够知道一个员工在什么部门
表1
create tale user(
id int unsigned auto_increment primary key,
name char(32) not null default'',
age int not null default 1, #age列的默认值是1
depertment int not null default 1 #depertment_id 的默认值是1
constraint depe_id foreign key user('deperment') references depertment('id') #创建一个外键的语句格式
depe_id(就是外键的名字,自定义) user就是表的名字(需要加约束的列名) depertment 就是外键表的名字(外键表的id列)
)charset=utf-8;
表2
creat table deperment(
id int unsigned auto_incerment pirmary key,
depname char(32) not null default
)charset=utf8;
外键的唯一索引唯一约束 (一对一)
---作用就是给这一列的值创建外键后,不能出现重复的值
唯一约束实例:场景就是一个博客,每一个用户名有一个专门的页面,这里数据库就要唯一性,一个用户名不能有多个博客,给链接地址表创建外键,用户名表和博客地址表建立关联,并且约束的列不能有重复的外键值
PS:就是一个用户名只能对应一个博客地址,这样的关系就是一对一
'''这张是用户表,存放用户名的'''
create table user(
id int unsigned auto_increment pirmary key,
name char(32) not null default''
)charset=utf8
'''这张是用户博客的地址表'''
create table article(
id int unigned auto_increment primary key,
url carchar(32) not null default'',
uid int not null default 1,
constraint fk_name foreign key('uid') reference user('id')
unique(uid) #给uid创建了约束,值不能重复
unique(id,url) #联合唯一索引
)charset=utf8;
PS:给article表的uid列增加了外键,并且添加了唯一约束的条件,所以如果uid值相同则会报错
外键的(多对多)
例:登陆服务器账号的权限的管理
PS:一个用户名可以同时对应多个主机,而一个主机也能够对用多个用户,这样关系就叫多对多
需求:要给用户添加登陆哪台服务器的权限,而且还能方便统计一个账号有几台服务器的权限
连表查询
需求:建立好外键后查看对应关系,不是要查看对应的id,而是查看名字对应的部门,或者账号对应的博客地址
PS:连表查询的效率是很低的,如果工作中业务是对外的,成百上千万的用户量,不要使用连表查询,如果是公司内部也就几十到几百人的访问量,使用连表查询不会有影响,因为针对上千万的用户量肯定要涉及到用户体验度关系到用户的接受度,数据量大的时候程序会跑半天,而公司内部没有那么高的数据量
inner join #这个叫笛卡尔积
select * from tablename1 inner join,tablename2 on tablename1.外键_id=tablenam2.id #将两张表的值所有列的值全部获取
select tablename1.列名, tablename2.列名 from tablename1 innerjoin tablename2 on tablename1.外键列_id=tablename2.id #查询获取的不是id,而是值对应的值
left join #左边的表数据全部显示
select * from tablename1 left join tablename2 on tablename1.外键列_id=tablename2.id #做好外键后查看对应的值,这个指令会将表对应表全部获取
PS: left join tablename2 on tablename1.外键列_id=tablename2.id后面还可以跟 left join tablename2 on tablename1.外键列_id=tablename2.id,可以进行三表联查或者四表联查
right join #右边的表数据全部显示
select * from tablename1 right join tablename2 on tablename1.外键列_id=tablename2.id #做好外键后查看对应的值,这个指令会将表对应表全部获取