为什么要使用外键

方案一

假设一个情景,你是小王,你的一个账户有3个外卖地址,分别送给自己,老板,老板娘,你的用户名叫高楼,密码是999999,因为你是这个app最先注册的,你的配送地址id包揽1、3、4。我是程序员小李,我看到这用户名和密码都是一样的,占了两个字段,如果还有电子邮件等等相同的信息,就会显得很冗杂~~(现在只有两个字段不是很明显)

user_info:
在这里插入图片描述

方案二

所以!!!我就要在数据库中建两个表,一个存放多个账户(包括用户名和密码等有重复可能的信息),一个存放相同账户的信息,
user_info:
在这里插入图片描述
address:
在这里插入图片描述
这就解决了冗杂的问题
但是这时候两表只是逻辑相关,而不是实际关联的,也就是说没有限制,比如一旦更改user_info的id331600,address中user_info_id就无所指,成为垃圾表,或者说在address中添加一个id,而这个id在user_info中不存在,即是一个空账户,所以这条信息没有用,也是垃圾信息

方案三

只要将user_info中的id与address中的user_info_id捆绑,建立锁定关系就可以解决方案二的问题,这就是外键的作用,将user_info_id设为外键,指向user_info的主键,可以保护数据完整性的作用:如果要删除的用户信息的id在address表中被使用(该账户设有地址),则该条数据无法删除(账户无法被删除);无法向address中添加不存在用户的地址信息(不能向空账户添加地址)
具体实现:
在创建address表时添加这样一行代码: constraint address_user_info_id_fk foreign key(user_info_id) references user_info(id)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值