为什么需要外键

背景:有一个京东账户,该账户下存有多个收货地址以及联系人,我们在数据库表中存放该数据

  1. 直接存放
#创建表
create table user_info(				
 	 id char(36) primary key, 	
 	 user_name varchar(30) not null,  
	 password varchar(30) not null,  
  	 real_name varchar(8),  
  	 mobile char(11),  
   	 address varchar(150)
  );
  #添加数据
  insert into user_info (id,user_name,password,real_name,mobile,address) 
  values ('51b28fe1-4ebf-41ac-a17b-d5e276861fd0','fuliuqingfeng','123456','张三','18920120206','河南安阳');
  insert into user_info (id,user_name,password,real_name,mobile,address) 
  values ('cc95772b-75a2-4702-bd99-4c3b0322d606','fuliuqingfeng','123456','李四','18617297545','北京海淀');
  insert into user_info (id,user_name,password,real_name,mobile,address)values 
  ('c63028fd-cf8d-4dac-a278-b5cc8fd61e3c','fuliuqingfeng','123456','王五','17694976949','山西大同');

若如此添加数据,产生的表为
在这里插入图片描述
此时会产生冗余,因为该用户的所有不同地址,都会有相同的user_name以及pass_word产生。

  1. 为了解决该问题,我们提出了一个想法,创建一个user_info表,包括其基本的注册信息,再创建一个表,名为address,在该表中,不存放基本注册信息,我们用一列来存放user_info表中的id,其余数据列则存放不同地址。
#创建user_info表
create table user_info(  
id char(36) primary key,  
user_name varchar(30) not null,  
password varchar(30) not null
)
#存放基本注册信息
insert into user_info (id,user_name,password) 
values ('51b28fe1-4ebf-41ac-a17b-d5e276861fd0','fuliuqingfeng','123456');
#创建address表
create table address(
  id char(36) primary key,
  user_info_id char(36),
  real_name varchar(8) not null,
  mobile char(11) not null,
  address varchar(150) not null
)
#添加地址信息
insert into address (id,user_info_id,real_name,mobile,address)
 values ('bfb9472a-7911-4e6f-a479-3b719454ebab','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','张三','18920120206','河南安阳');
insert into address (id,user_info_id,real_name,mobile,address)
 values ('5227c6b9-45a2-44aa-8ac0-1f63a38d3b65','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','李四','18617297545','北京海淀');
insert into address (id,user_info_id,real_name,mobile,address)
 values ('30b8584b-aa6a-4516-a623-03f487058586','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','王五','17694976949','山西大同');  

产生的结果为两个表一个存基本信息,一个存不同的收货人地址
!!但是这样存放时会产生一个问题,因为没有约束,我可以肆意的往address里边添加数据,即便并不存在user_info_id, 其次我也可以在正确的添加完address后,删除user_info表中的该id的信息,无论以上哪种错误,都会导致信息的无效,产生冗余。
为了解决以上方法,我们运用sql语句中的外键关键字foreign key

#创建user_info表
create table user_info(  
id char(36) primary key,  
user_name varchar(30) not null,  
password varchar(30) not null
)
#存放基本注册信息
insert into user_info (id,user_name,password) 
values ('51b28fe1-4ebf-41ac-a17b-d5e276861fd0','fuliuqingfeng','123456');
#创建address表
create table address(
  id char(36) primary key,
  user_info_id char(36),
  real_name varchar(8) not null,
  mobile char(11) not null,
  address varchar(150) not null,
  foreign key (user_info_id) references user_info(id)
)
#添加地址信息
insert into address (id,user_info_id,real_name,mobile,address)
 values ('bfb9472a-7911-4e6f-a479-3b719454ebab','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','张三','18920120206','河南安阳');
 insert into address (id,user_info_id,real_name,mobile,address)
 values ('5227c6b9-45a2-44aa-8ac0-1f63a38d3b65','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','李四','18617297545','北京海淀');
 insert into address (id,user_info_id,real_name,mobile,address)
 values ('30b8584b-aa6a-4516-a623-03f487058586','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','王五','17694976949','山西大同');  

此时我们进行实验,若我们删除user_info表中的信息时会报错,不允许这样做,当我们给address表中添加一个并不存在的id时,也会报错。不允许这样做,从而解决了刚刚发生的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值