1.实体

       数据库管理系统中的各种用于数据管理方便而设定的各种数据管理对象,如:数据库表、视图、存储过程等都是数据库实体。广义上讲,这些对象中所存储的数据也是数据库实体。因为它们也是确切存在着的实体。

2.实体关系(表设计)

(1)1对1的关系:

两个实体表内,存在相同的主键字段;

如果记录的主键值等于另一个关系表内记录的主键值,则两条记录的对应为1对1 对应关系

下图示例:

这里本来这里的学生主信息表 和 学生详细信息表应该水平方向上连接起来,但是这里垂直分割了,这里在优化上称之为:垂直分割

通常一个表中的记录字段过多情况之下,我们通常都要拆分两个或者多个,分为常用信息表和不常用信息表;

只要这些拆分的多个表拥有统一的主键值ID,他们在逻辑上就是关联的。

(2)1对多的关系:

一个实体,对应多个其他实体,例如一个班级对应多个学生:

设计方案:

在多个那端(这里就是多个学生),增加一个字段(班级号),用于指向该实体所属的另外实体的标识;

(3)多对多的关系:

设计典型的利用一个中间表表示实体之间的对应关系。中间表的每一条记录表示一个关系。

 可以分析:一个m:n可拆解为 1:m  1:n来实现:

3.外键 (foreign key)

     (1) 概念:如果一个实体(itcast_student)的某个字段(student:class_id),指向(引用)另一个实体(itcast_class)的主键(class:class_id)

就称student实体的class_id是这两个实体关联的外键。

被指向的实体称为主实体(主表),也叫父实体(父表),这里就是itcast_class就是主表

 负责指向的实体,称之为从实体(从表),也叫子实体(子表),这里就是itcast_student就是从表

   (2)外键作用:

用于约束处于关系内的实体。

增加子表记录时,是否有与之对应的父表记录。

在删除或者更新主表记录时候,子表应该如何处理相关的记录。

    (3)定义一个外键:

在从表上,增加一个外键字段,指向主表的主键。

使用关键字foreign key

语法:alter table 表名 add constraint FK_ID foreign key(你的外键字段名) references 外表表名(对应的表的主键字段名);
例:
alter table tb_active add constraint FK_ID foreign key(user_id) references tb_user(id)
 
  (4)下面用实例演绎上面的itcast_student 和itcast_class:
 ->1.首先查询数据库,使用hebao数据库,如下:
同时设置服务器端和客户端的通信编码为gbk;
 
 
->2.创建表itcast_class,如下:
这里comment是注释的意思,方便用户理解数据含义:
 
 
我们查询我们创建的itcast_class,看看我们创建的表有没有成功,如下:
 
 
->3.同样的道理,我们创建一下itcast_student,如下:
查询一下我们创建的itcast_student:
 
 
->4.这个时候我们插入数据到itcast_student之中,如下:
 
我们发现这里报错了,这是因为这里并没有class_id = 1的记录在itcast_class中,所以会报错,所以我们在插入数据之前,我们先插入一条记录到itcast_class之中,如下:
 
 
这时候我们发现再次插入数据记录到itcast_student之中就不会报错。
这个时候我们来再次查询一下我们的itcast_student 和 itcast_class,如下:
 
 
(5)设置级联操作

 在主表数据发生改变时,与之关联的从表数据该如何变化:

         主表更新

         主表删除

使用关键字on update,on delete来标识

4.主表删除:on delete来标识

允许的级联操作:(主表数据发生改变的时候,对从表进行处理)

         Cascade:关联操作,如果主表被删除,那么从表也会执行相关的操作

          Set null : 设置为null表示从表不指向任何主表记录

          Restrict :拒绝主表的相关操作

修改外键:先删除再新建外键,通过修改表来完成。

语法:

        删除外键:Alter  table  tbl_name  drop  foreign  key (class_id);

删除外键需要通过指定外键名称达到目的,可以通过在创建外键时,制定名称,或者使用MySQL默认生成的名称。

        添加外键:Alter  table  tbl_name  add   foreign  key ()

如下红色下划线部分是系统分配给itcast_student的外键名称:

下面我们通过实践理解上面内容:

(1)删除外键:

上面可见,我们已经删除外键成功,但是数据并没有删除,我们删除只是一条规则而已(外键),如下可见itcast_student中的数据没有删除:

(2)上面删除外键之后,我们再新建一个外键(为了增加级联操作):

mysql> alter table itcast_student add foreign key (class_id)  references itcast_class (class_id) on delete set null;

on delete set null:表示删除时,将从表外键设置为null

 (3)接下来我们删除数据,观察级联操作(set null):

(4)删除数据,观察级联操作(cascade):

首先我们重新维护一下数据(由于上面操作,使得数据改变,所以我们先维护一下数据,不然会找不到数据)

insert  into  itcast_class  values  (1,'php0331');

update itcast_student set  class_id = 1  where  stu_id = 2;

同样和上面之前一样,我们先删除外键,然后自己定义外键,只不过这里定义外键为级联操作(on delete cascade:删除主表数据,从表也会被删除掉数据):

因为删除是不可逆的过程,所以我们做好还是使用set null

5.主表更新:on update来标识

我们接下来单独测试on update,如下:

我们先重新维护一下数据:

重新删除外键,设置外键:

此时我们更新主表itcast_class,我们发现主表不能更新,这是因为之前我们已经设置外键update restrict:

更新存在关联的主表数据的主键字段出现的问题如下:

MySQL(10):实体、实体表和外键(foreign key)的更多相关文章

  1. 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)

    1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...

  2. Oracle外键(Foreign Key)使用详细的说明(一)

    Oracle外键(Foreign Key)使用详细的说明(一) 1.目标 演示如何Oracle使用外键数据库 2.什么是外键? 1)在Oracle数据库中,外键是用来实现參照完整性的方法之中的一个.打 ...

  3. MYSQL外键(Foreign Key)的使用

    在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束.外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持): ...

  4. MySQL建立外键(Foreign Key)

    如果在最初建立表的时候就建立外键这样一般不会有什么问题,顺便说一下建立外键的时候,需要注意的地方. cascade方式在父表上update/delete记录时,同步update/delete掉子表的匹 ...

  5. 组合外键(FOREIGN KEY)

    一张表,它的外键即是参考另一张表的主键,但这些关联键是组合键,由2列或多列组成. 你可以先看看这篇<多列组合为主键(PRIMARY KEY)>https://www.cnblogs.com ...

  6. 外键(foreign key)的使用及其优缺点

    如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键.由此可见,外键表示了两个关系之间的相关联系.以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表. ...

  7. MySQL基础day03 存储引擎和外键MySQL 5.6

    MySQL基础day03_存储引擎和外键-MySQL 5.6 外键的条件: 1,表的存储引擎为innodb存储引擎 2,表中外键字段的类型要与参考表的字段类型一致 3,外键字段要是索引类型中的一种 M ...

  8. mysql 约束条件 外键 forigen key 介绍

    外键 forigen key作用 :建立表之间的关系 什么是外键 员工信息表有这些字段:id号  姓名 性别 员工所在部门名 部门描述信息 公司有3个部门,但是有1个亿的员工,那意味着 员工所对应的部 ...

  9. mysql修改删除列,删除有外键依赖的列

    –重命名表rename table t_softwareport to software_port; –建立外键alter table software_port add constraint fk_ ...

随机推荐

  1. IOC(控制反转)与DI(依赖注入)的个人理解。

    控制反转IOC(Inversion of Control)的三个需要理清问题: 1.谁控制了谁,控制了什么东西?IOC容器控制了依赖对象的创建. 2.谁得到了反转? 一般的应用程序是,直接创建依赖于该 ...

  2. 解决delphi使用sqlite时中文最后一个字是乱码的问题

    给部门同事写了个自动生成测试用例执行情况图表的工具,使用的sqlite3,遇到中文分别使用UTF8Encode和UTF8Decode进行处理,可还是出现了某些字段从数据库中读出时,最后一个汉字是乱码的 ...

  3. Hibernate Is Not Mapped(实体名 is not mapped [from book where id='0'])

    org.springframework.orm.hibernate3.HibernateQueryException: USERINFO is not mapped.看到.hbm.xml文件中的< ...

  4. 测试一下MarkDown

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接 ...

  5. JSch - Java实现的SFTP(文件上传详解篇)(转)

    JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到 ...

  6. JS仿淘宝详情页菜单条智能定位效果

    类似于淘宝详情页菜单条智能定位 对于每个人来说并不陌生!如下截图所示:红色框的那部分! 基本原理: 是用JS侦听滚动事件,当页面的滚动距离(页面滚动的高度)大于或者等于 "对象"( ...

  7. jinfo命令(Java Configuration Info)

    jinfo可以输出并修改运行时的java 进程的opts.用处比较简单,用于输出JAVA系统参数及命令行参数.用法是jinfo -opt  pid 如:查看2788的MaxPerm大小可以用  jin ...

  8. 数据结构(启发式合并):HNOI 2009 梦幻布丁

    Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input 第 ...

  9. ExecuteScalar的学习日志

    一:今天写关于调用sqlhelper类的时候出现了一个异常,我仔细观察没有错误啊,怎么回事:看图 二:出现错误时id的结果是0,也就是说ExcuteScalar的结果是null,明明数据库里有多行数据 ...

  10. web.xml 详解contextConfigLocation 转

    spring的应用初始化流程一直没有搞明白,刚刚又碰到了相关的问题.决定得好好看看这个流程.我们在开发spring的项目当中基本上都会在web.xml通过: <context-param> ...