1. 外键约束

  • 约束 : 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、关联性
  • foreign key 功能 : 建立表与表之间的某种约束的关系,由于这种关系的存在,能够让表与表之间的数据,更加的完整,关连性更强,为了具体说明创建如下部门表和人员表。
  • 示例
# 创建部门表
CREATE TABLE dept (id int PRIMARY KEY auto_increment,dname VARCHAR(50) not null);
# 创建人员表
CREATE TABLE person (id int PRIMARY KEY AUTO_INCREMENT,name varchar(32) NOT NULL,age tinyint unsigned,salary decimal(8,2),dept_id int
) ;

上面两个表中每个人员都应该有指定的部门,但是实际上在没有约束的情况下人员是可以没有部门的或者也可以添加一个不存在的部门,这显然是不合理的。

  • 主表和从表:若同一个数据库中,B表的外键与A表的主键相对应,则A表为主表,B表为从表。
  • foreign key 外键的定义语法:

    [CONSTRAINT symbol] FOREIGN KEY(外键字段) REFERENCES tbl_name (主表主键)[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}][ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
    

    该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用

    # 创建表时直接简历外键
    CREATE TABLE person (id int PRIMARY KEY AUTO_INCREMENT,name varchar(32) NOT NULL,age tinyint unsigned,salary decimal(10,2),dept_id int ,constraint dept_fk foreign key(dept_id) references dept(id));
    

建立表后增加外键

alter table person add constraint dept_fk foreign key(dept_id) references dept(id);

注意:

  1. 并不是任何情况表关系都需要建立外键来约束,如果没有类似上面的约束关系时也可以不建立。
  2. 从表的外键字段数据类型与指定的主表主键应该相同。
  • 通过外键名称解除外键约束

    alter table person drop foreign key dept_fk;# 查看外键名称
    show create table person;
    

    注意:删除外键后发现desc查看索引标志还在,其实外键也是一种索引,需要将外键名称的索引删除之后才可以。

  • 级联动作

    • restrict(默认) : on delete restrict on update restrict

      • 当主表删除记录时,如果从表中有相关联记录则不允许主表删除
      • 当主表更改主键字段值时,如果从表有相关记录则不允许更改
    • cascade :数据级联更新 on delete cascade on update cascade
      • 当主表删除记录或更改被参照字段的值时,从表会级联更新
    • set null : on delete set null on update set null
      • 当主表删除记录时,从表外键字段值变为null
      • 当主表更改主键字段值时,从表外键字段值变为null

2. 表关联关系

当我们应对复杂的数据关系的时候,数据表的设计就显得尤为重要,认识数据之间的依赖关系是更加合理创建数据表关联性的前提。一对多和多对多是常见的表数据关系:

  • 一对多关系

一张表中有一条记录可以对应另外一张表中的多条记录;但是反过来,另外一张表的一条记录
只能对应第一张表的一条记录,这种关系就是一对多或多对一

举例: 一个人可以拥有多辆汽车,每辆车登记的车主只有一人。

create table person(id varchar(32) primary key,name varchar(30),age int
);create table car(id varchar(32) primary key,brand varchar(30),price decimal(10,2),pid varchar(32),foreign key(pid) references person(id)
);
  • 多对多关系

一对表中(A)的一条记录能够对应另外一张表(B)中的多条记录;同时B表中的一条记录
也能对应A表中的多条记录

举例:一个运动员可以报多个项目,每个项目也会有多个运动员参加,这时为了表达多对多关系需要单独创建关系表。

CREATE TABLE athlete (id int primary key AUTO_INCREMENT,name varchar(30),age tinyint NOT NULL,country varchar(30) NOT NULL
);CREATE TABLE item (id int primary key AUTO_INCREMENT,rname varchar(30) NOT NULL
);CREATE TABLE athlete_item (id int primary key auto_increment,aid int NOT NULL,tid int NOT NULL,FOREIGN KEY (aid) REFERENCES athlete (id),FOREIGN KEY (tid) REFERENCES item (id)
);

3. E-R模型图

  • 定义
E-R模型(Entry-Relationship)即 实体-关系 数据模型,用于数据库设计
用简单的图(E-R图)反映了现实世界中存在的事物或数据以及他们之间的关系
  • 实体、属性、关系

​ 实体

1、描述客观事物的概念
2、表示方法 :矩形框
3、示例 :一个人、一本书、一杯咖啡、一个学生

​ 属性

1、实体具有的某种特性
2、表示方法 :椭圆形
3、示例学生属性 :学号、姓名、年龄、性别、专业 ... 感受属性 :悲伤、喜悦、刺激、愤怒 ...

​ 关系

1、实体之间的联系
2、一对多关联(1:n)
3、多对多关联(m:n)
  • E-R图的绘制

矩形框代表实体,菱形框代表关系,椭圆形代表属性

4. 表关联查询

如果多个表存在一定关联关系,可以多表在一起进行查询操作,其实表的关联整理与外键约束之间并没有必然联系,但是基于外键约束设计的具有关联性的表往往会更多使用关联查询查找数据。

  • 简单多表查询

多个表数据可以联合查询,语法格式如下:

select  字段1,字段2... from 表1,表2... [where 条件]
e.g.
select * from class,hobby where class.name = hobby.name;

笛卡尔积现象就是将A表的每一条记录与B表的每一条记录强行拼在一起。所以,如果A表有n条记录,B表有m条记录,笛卡尔积产生的结果就会产生n*m条记录。

select * from class,hobby;
  • 内连接

内连接查询只会查找到符合条件的记录,其实结果和表关联查询是一样的,官方更推荐使用内连接查询。

SELECT 字段列表FROM 表1  INNER JOIN  表2
ON 表1.字段 = 表2.字段;
select * from person inner join  dept  on  person.dept_id =dept.id;
  • 左连接 : 左表全部显示,显示右表中与左表匹配的项

SELECT 字段列表FROM 表1  LEFT JOIN  表2
ON 表1.字段 = 表2.字段;
select * from person left join  dept  on  person.dept_id =dept.id;# 查询每个部门员工人数
select dname,count(name) from dept left join person on dept.id=person.dept_id group by dname;
  • 右连接 :右表全部显示,显示左表中与右表匹配的项

SELECT 字段列表FROM 表1  RIGHT JOIN  表2
ON 表1.字段 = 表2.字段;
select * from person right join  dept  on  person.dept_id =dept.id;

注意:我们尽量使用数据量大的表作为基准表,放在前面。

综合查询练习create table class(cid int primary key auto_increment,caption char(4) not null);create table teacher(tid int primary key auto_increment,tname varchar(32) not null);create table student(sid int primary key auto_increment,sname varchar(32) not null,gender enum('male','female','others') not null default 'male',class_id int,foreign key(class_id) references class(cid)on update cascadeon delete cascade);create table course(cid int primary key auto_increment,cname varchar(16) not null,teacher_id int,foreign key(teacher_id) references teacher(tid)on update cascadeon delete cascade);create table score(sid int primary key auto_increment,student_id int,course_id int,number int(3) not null,foreign key(student_id) references student(sid)on update cascadeon delete cascade,foreign key(course_id) references course(cid)on update cascadeon delete cascade);insert into class(caption) values('三年二班'),('三年三班'),('三年一班');
insert into teacher(tname) values('波多老师'),('苍老师'),('小泽老师');
insert into student(sname,gender,class_id) values('钢蛋','female',1),('铁锤','female',1),('山炮','male',2),('彪哥','male',3);
insert into course(cname,teacher_id) values('生物',1),('体育',1),('物理',2);
insert into score(student_id,course_id,number) values(1,1,60),(1,2,59),(2,2,100),(3,2,78),(4,3,66);1. 查询每位老师教授的课程数量
2. 查询学生的信息及学生所在班级信息
3. 查询各科成绩最高和最低的分数,形式 : 课程ID  课程名称 最高分  最低分
4. 查询平均成绩大于85分的所有学生学号,姓名和平均成绩
5. 查询课程编号为2且课程成绩在80以上的学生学号和姓名
6. 查询各个课程及相应的选修人数
7. 查询每位学生的姓名,所在班级和各科平均成绩

MYSQL外键约束和表关联相关推荐

  1. MySQL——外键约束

    设置外键约束(FOREIGN KEY, FK ) MySQL外键约束是表的一个特殊字段,经常与外键约束一起使用.对于两个具有关联关系的表而言,相关字段中主键所在表称为主表(父表),外键所在表称为从表( ...

  2. oracle删除库里的所有表,清空mysql指定库里全部表数据-自动删除所有表,有外键约束的表优先删除...

    清空mysql指定库里所有表数据-自动删除所有表,有外键约束的表优先删除 由于要清空数据库数据 ,手动非常麻烦.网上找了一下,有一个Oracle的,参照它,在其上修改一下用于Mysql,把代码奉献如下 ...

  3. mysql 外键约束_MySQL之外键约束(FOREIGN KEY)

    定义: MySQL外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列.一个表可以有一个或多个外键. 外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每 ...

  4. mysql外键约束怎么写_mysql外键约束怎么写

    mysql外键约束的写法:[[CONSTRAINT ] FOREIGN KEY 字段名 REFERENCES 主键列1].外键约束是表的一个特殊字段,经常与主键约束一起使用. 在 CREATE TAB ...

  5. Mysql外键约束怎么删除

    记录一下碰到的问题.由于我是使用PowerDesigner来建mysql物理模型的,为了表与表之间的关系更加清楚,我给他们连线了.之后我就用它生成的SQL语句在navicat把表建出来,我看见没问题就 ...

  6. Mysql外键约束的创建与删除

    在Mysql中使用外键,可以有效地将多个表格的数据"联动"起来,打破独立状态,互相影响. 文章目录 创建表时创建外键 给存在的表添加外键 删除外键约束 创建表时创建外键 创建两个表 ...

  7. mysql外键约束详解_详解MySQL 外键约束

    详解MySQL 外键约束,西欧,西西里,玛雅,兵种,诺曼 详解MySQL 外键约束 易采站长站,站长之家为您整理了详解MySQL 外键约束的相关内容. 官方文档: https://dev.mysql. ...

  8. MySQL外键约束(FOREIGN KEY)

    MySQL外键约束(FOREIGN KEY) MySQL 外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列.一个表可以有一个或多个外键. 外键对应的是参照完整性, ...

  9. mysql外键约束cascade_mysql外键约束foreign key ON DELETE CASCADE ON UPDATE CASCADE

    正 文: 一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整 ...

最新文章

  1. 【总有一些东西要弄清】——说说面试时一系列的CSS问题
  2. 如何以及为什么使用Spoon分析,生成和转换Java代码
  3. 宝塔常用的命令大全(直接上官网)
  4. ruby sinatra mysql_一分钟开始持续集成之旅系列之:Ruby + Sinatra 应用
  5. hbase 使用lzo_带你快速上手HBase | HBase列族优化
  6. php 字符串分割出数字,php 字符串分割函数的总结
  7. 解读现代存储系统背后的经典算法
  8. VS出现error LNK2005,error C4430,error C2011
  9. TASKCTL高可用架构调度服务与安装
  10. 只需三步即可将 Python 程序转换成 exe 文件
  11. Wing-新一代百度大数据查询引擎
  12. CIM是什么?CIM智慧城市建设路径分析
  13. DeepFool论文翻译---DeepFool: a simple and accurate method to fool deep neural networks
  14. 电脑桌面打开计算机打开多个,如何在电脑桌面并排显示多个Excel工作表
  15. JPinyin繁体相互转换
  16. 脑机接口专栏 | 如何分析静息状态的fMRI数据?(二)
  17. 从单一服务到多元化服务,智能机器人JIMI的架构改造及逐步开放的过程
  18. SpringCloud之服务提供者和服务消费者
  19. org.apache.flume.conf.ConfigurationException: Channel c1 not in active set.
  20. 泰山OFFICE技术讲座:字体的kerning是什么意思

热门文章

  1. 三维目标检测---BtcDet论文解读 Behind the Curtain: Learning Occluded Shapes for 3D Object Detection
  2. 如何在跨境电商平台开店呢?
  3. 理正消息服务器,理正图纸打印系统
  4. SAP 交货成本(运费)
  5. 1039家校通 万能密码绕过 CNVD-2020-31494
  6. 【§金黄与风筝xp电脑主题下载§美化】
  7. php和mysql的实践报告_PHP+MySQL项目开发与实践
  8. DiffUtil的使用
  9. salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载
  10. C 算法精介----链表-双向链表