外键(FOREIGN KEY)

外键(FOREIGN KEY)引子:把所有数据都存放于一张表的弊端  1、表的组织结构复杂不清晰  2、浪费空间  3、扩展性极差为了解决上述的问题,就需要用多张表来存放数据。表与表的记录之间存在着三种关系:一对多、多对多、一对一的关系。处理表之间关系问题就会利用到FOREIGNKEY多对一关系:寻找表与表之间的关系的套路  举例:雇员表:emp表  部门:dep表    part1:    …

大家好,又见面了,我是你们的朋友全栈君。

引子:把所有数据都存放于一张表的弊端

    1、表的组织结构复杂不清晰

    2、浪费空间

    3、扩展性极差

为了解决上述的问题,就需要用多张表来存放数据。

表与表的记录之间存在着三种关系:一对多、多对多、一对一的关系。

处理表之间关系问题就会利用到FOREIGN KEY

多对一关系:

寻找表与表之间的关系的套路

    举例:雇员表:emp表   部门:dep表

        part1:

        1、先站在表emp的角度

        2、去找表emp的多条记录能否对应表dep的一条记录。

        3、翻译2的意义:

            左表emp的多条记录==》多个员工

            右表dep的一条记录==》一个部门

            最终翻译结果:多个员工是否可以属于一个部门?

            如果是则需要进行part2的流程

        part2:

        1、站在表dep的角度

        2、去找表dep的多条记录能否对应表emp的一条记录

        3、翻译2的意义:

            右表dep的多条记录==》多个部门

            左表emp的一条记录==》一个员工

            最终翻译结果:多个部门是否可以包含同一个员工

            如果不可以,则可以确定emp与dep的关系只一个单向的多对一

            如何实现?

            此时就可以用到外键了,在emp表中新增一个dep_id字段,该字段指向dep表的id字段

foreign key会带来什么样的效果?


约束1:在创建表时,先建被关联的表dep,才能建关联表emp

create table dep(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
);

create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id)
);

约束2:在插入记录时,必须先插被关联的表dep,才能插关联表emp

insert into dep(dep_name,dep_comment) values
('教学部','辅导学生学习,教授课程'),
('公关部','处理公关危机'),
('技术部','开发项目,研究技术');

insert into emp(name,gender,dep_id)  values
('monicx0','male',1),
('monicx1','male',2),
('monicx2','male',1),
('monicx3','male',1),
('lili','female',3);

外键(FOREIGN KEY)

约束3:更新与删除都需要考虑到关联与被关联的关系。

解决方案:

1、先删除关联表emp,再删除被关联表dep,准备重建

2、重建:
新增功能,同步更新,同步删除

create table dep(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
);

create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id)
    on update cascade
    on delete cascade
);

此时再去修改:

外键(FOREIGN KEY)

得到结果:

外键(FOREIGN KEY)

此时再去删除:

外键(FOREIGN KEY)

得到结果:

外键(FOREIGN KEY)

多对多的关系:

两张表记录之间是一个双向的多对一关系,称之为多对多关系。

如何实现?

建立第三张表,该表中有一个字段foreign key左表的id,还有一个字段是foreign key右表的id

create table author(
    id int primary key auto_increment,
    name char(16)
);

create table book(
    id int primary key auto_increment,
    bname char(16),
    price int
);

insert into author(name) values
('monicx1'),
('monicx2'),
('monicx3')
;
insert into book(bname,price) values
('python从入门到入土',200),
('liunx从入门到入土',400),
('java从入门到入土',300),
('php从入门到入土',100)
;
#建立第三张表:
create table author2book(
    id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(author_id) references author(id)
    on update cascade
    on delete cascade,
    foreign key(book_id) references book(id)
    on update cascade
    on delete cascade
);

insert into author2book(author_id,book_id) values
(1,3),
(1,4),
(2,2),
(2,4),
(3,1),
(3,2),

一对一关系

左表的一条记录唯一对应右表的一条记录,反之也一样

create table customer(
    id int primary key auto_increment,
    name char(20) not null,
    qq char(10) not null,
    phone char(16) not null
);

create table student(
    id int primary key auto_increment,
    class_name char(20) not null,
    customer_id int unique, #该字段一定要是唯一的
    foreign key(customer_id) references customer(id) #此时外键的字段一定要保证unique
    on delete cascade
    on update cascade
);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148170.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 金三银四,教你编写一份脱颖而出的简历,从而 offer 手到擒来,要参加校招的同学要提前准备了「建议收藏」

    金三银四,教你编写一份脱颖而出的简历,从而 offer 手到擒来,要参加校招的同学要提前准备了「建议收藏」最近一段时间不是金三银四嘛,有不少同学通过CSDN私信的方式把简历发给我,要我给出一些建议。看多了以后,我发现,有些同学根本不知道怎么写简历,格式乱七八糟,填写的个人经历就像是记流水账一样,完全勾不起我的任何兴趣。那,招聘方应该比我更苛刻,所以这样的简历投递出去,石沉大海的几率很大啊。2014年,我从苏州回到了洛阳,那是我最后一次投简历,现在还在招聘网站上挂着——公开的。嗯,在这么多年的时间里,并没有招聘方和猎头通过这份挂出去的简历给我打电话,虽然我的联系方式一直没变。那只能说明一点,我当时写的简历

  • matlab循环读取txt文件「建议收藏」

    matlab循环读取txt文件「建议收藏」一般情况下,假如我要读取一个名为a.txt的文件,只需要利用下面的语句:a=load(‘a.txt’);现在假如我需要循环读取saif_1.txt,saif_2.txt,,,一直到saif_10.txt,他们都是10*1的矩阵,对他们进行转置操作后,再合并到一个文件中,可以利用下面的语句:forN=1:10a=load([‘saif_’,num2str(N),’.txt’]);……

  • Axis2创建WebService实例

    Axis2创建WebService实例Axis2创建WebService实例博客分类: Java综合WebServiceTomcatApacheWebXML   一、Axis2的下载和安装    1.可从http://ws.apache.org/axis2/ 下载Axis2的最新版本:     可以下载如下两个zip包:     axis2-1.5.4-bin.zip 

  • AdminLTE Button小结

    AdminLTE Button小结AdminLTEButton小结

  • Android之使用weight属性实现控件的按比例分配空间

    从今天开始,把看书时候的知识点整理成博客,这个比较简单,估计有经验的都用过,weight属性 在做Android布局的时候,经常遇到需要几个控件按比例分配空间的情况比如下图效果在底部设置两个button,占据底部宽度一部分的同时,保持1:3的比例,当然了,这么难看的布局用处不大,仅是用来说明weight的用法布局代码如下:

  • java和html_如何区别html和html5

    java和html_如何区别html和html5JSP和HTMLJSP代表JavaServerPages;它主要用于开发动态网页,文件的扩展名为.jsp。JSP的主要优点是程序员可以在HTML中插入Java代码;使用JSP标签插入Java代码。程序员可以编写<%标签来启动Java代码,并在Java代码的末尾写入%>标签。JSP允许在HTML文件中插入Java代码HTML代表超文本标记语言。它是众所周知的用于开发网页的标记语言,有助于构建网页结构。JSP和HTML之间的区别1、采用的技术不同HTML是客户端技术,提供

    2022年10月23日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号