外键(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
);

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • eBPF 介绍_bcp方案是什么意思

    eBPF 介绍_bcp方案是什么意思eBPF介绍Tcpdump是Linux平台常用的网络数据包抓取及分析工具,tcpdump主要通过libpcap实现,而libpcap就是基于eBPF。先介绍BPF(BerkeleyPacketFilter),BPF是基于寄存器虚拟机实现的,支持JIT(Just-In-Time),比基于栈实现的性能高很多。它能载入用户态代码并且在内核环境下运行,内核提供BPF相关的接口,用户可以将代码编译成字节码,通过BPF接口加载到BPF虚拟机中,当然用户代码跑在内核环境中是有风险的

    2022年9月21日
    3
  • 网页内容变化实时监控提醒(多个复杂的监控条件)

    网页内容变化实时监控提醒(多个复杂的监控条件)网页内容更新后,如果更新的内容满足一个或多个条件时,就发出报警提醒。1、如下图所示,地震台网站实时显示地震信息,如果发生新的地震且震级大于等于5.0级、震源深度小于50千米时报警提醒。先观察一下页面布局,最新的地震信息永远显示在第一行,因此我们也只需要监控第一行地震数据更新就可以了。首先,点击木头浏览器自动控制菜单下的项目管理器。2、在木头浏览器项目管理窗口左侧的步骤树中点击右键,新建一个定时控制步骤,并设定间隔30秒执行一次。3、新建一个打开网页的步骤,输入地震台网站地址4、新建一个元素

    2022年7月17日
    14
  • 见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频「建议收藏」

    见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频「建议收藏」前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCIIAnimator进行ASCII字符转换把转换的字符gif根据每

    2022年4月28日
    53
  • 如何使用eclipse创建JAVA项目并写一个简单的HelloWorld

    如何使用eclipse创建JAVA项目并写一个简单的HelloWorld打开eclipse软件,选择好工作区域(就是项目的储存地址)后登陆。File-New-Project选择JavaProject输入项目名称点击完成(Finish)在SRC(SRC是专门放java源代码的文件夹,就是你在IDE里编写的各个java类的文件都在里面)中新建package包包的命名规范:包名全部使用小写。包名通常由若干个标识符…

    2022年7月24日
    9
  • java中int和char转换_java 二维数组

    java中int和char转换_java 二维数组在java中int与char之间的互相转化引言数据类型在介绍int与char的转换之前,我们先来回顾一下java中的基本数据类型:|类型|大小|包装器类型||boolean|-|Boolean||char|16-bit|Character||byte|8bits|Byte||short|16bits|Short|…

    2022年4月19日
    99
  • React 路由—基本使用「建议收藏」

    React 路由—基本使用「建议收藏」一:安装运行npmireact-router-dom安装react路由依赖项创建一个App.js根组件,并在根组件中,按需导入路由需要的三个组件HashRouter:表示路由的包裹

    2022年8月2日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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