MySQLStudy——外键

本文探讨了在数据库设计中不使用外键可能引发的数据重复和空间浪费问题,并提出了解决方案,即通过创建部门表并利用外键关联员工表,有效避免数据冗余。此外,还介绍了外键的变种——唯一索引和联合唯一索引的作用,以及如何在关系模型中实现一对多、一对一和多对多的关系。
摘要由CSDN通过智能技术生成

不建立外键的情况下遇到的问题

1. 数据重复

2. 如果 部门过长的话, 太占用空间

解决方法

重新设计一张表, 这张表 中存放部门的相关信息


部门表

create table department (
id int auto_increment primary key, 
depart_name varchar(32) not null default ''
)engine=Innodb charset=utf8;

insert into department (depart_name) values ('公关'), ('关关'),('关公');

create table userinfo (    
id int auto_increment primary key, 
name varchar(32) not null default '',
depart_id int not null default 1,

# constraint 外键名(fk_userinfo_depart) foreign key (列名(depart_id)) references 表名(department)(关联的列名(id)),
constraint fk_userinfo_depart foreign key (depart_id) references department(id)

)engine=Innodb charset=utf8;


insert into userinfo (name, depart_id) values ('root1', 1);
insert into userinfo (name, depart_id) values ('root2', 2); 错误的

注意:

创建多个外键的时候, 名称不能一样

=====> 一对多

 

外键的变种

唯一索引

create table t5(
id int,
num int,
unique(num)
)engine=Innodb charset=utf8;

作用:    
num列的值不能重复
加速查找

联合唯一索引

create table t6(
id int,
num int,
unique(id, num)
)engine=Innodb charset=utf8;

联合唯一索引作用:    
num列和id列的值不能重复
加速查找

create table t6(
id int,
num int,
unique(id, num......)
)engine=Innodb charset=utf8;

关系模型

一对多

部门表:
id depart_name
1 公关部
2 公共部
3 保安部

员工表:
id name age depart_id(外键)
1 lxxx 12 2
2 xxxx 13 1
3 xxxx 13 2

一对一

用户表:
id name age 
1 zekai 23 
2 eagon 34
3 lxxx 45
4 owen 83

博客表:
id url user_id (外键 + 唯一约束)
1 /linhaifeng 2
2 /zekai    1
3 /lxxx 3
4 /lxxx 4

多对多

用户表:
id    name    phone 
1    root1    1234
2    root2    1235
3    root3    1236
4    root4    1237
5    root5    1238
6    root6    1239
7    root7    1240
8    root8    1241

主机表:

id    hostname    
1    c1.com    
2    c2.com    
3    c3.com    
4    c4.com    
5    c5.com


为了方便查询, 用户下面有多少台主机以及某一个主机上有多少个用户, 我们需要新建第三张表:
user2host:

id    userid    hostid
1    1    1
2    1    2
3    1    3
4    2    4
5    2    5
6    3    2
7    3    4    
创建的时候, userid 和 hostid 必须是外键, 然后联合唯一索引 unique(userid, hostid)

Django orm 也会设计

转载于:https://www.cnblogs.com/tingguoguoyo/p/11040591.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值