关系型数据库中实体之间的关系
关系型数据库实体间有三种关联关系:一对一,一对多,多对多。
一对一关系(1:1):
如果实体集(表)A 中的每一个实休(就是每行记录),在实体集B中只有一条数据与它对应,
反之实体集B 中的每一个实体,在实体A中只有一条数据与它对应
这样的实体关系主是一对一关系
实例:
员工表、员工详细信息表之间的关系是员工表中的一行与详细信息表中的一行对应
一对多关系(1:n):
如果实体集A中每一个实体,在实体集B中有n个与之对应(n>1)(当n为1时,就是一对一的关系)
反之在实体集B中每一个实体,在实体集A中最多只有一个实体与之对应
这样的实体就是一对多关系
实例:
学生表与班级表,多个学生属于同一个班级,班级表中的一行与学生表的多行数据对应
在学生表中新增字段(班级号),该字段作为学生表的外键与班级表中的班级号关联。每一个学生实体在班级号字段的值,表示该学生属于的班级。
多对多关系(m:n):
如果实体集A中每一个实体,在实体集B中有m个与之对应(m>1)
反之如果实体集B中每一个实体,在实体集A中也有n个与之对应(n>1)
这样的实体关系就是多对多关系
实例:
学生表与教师表,一位学生有多位老师来教,一位老师也可以教多位学生,可以看作由两个一对多关系组合而成
外键:
mysql中的innodb引擎才支持外键
A实体的某个字段指向 B实体的主键, 则称A实体的那个字段为该实体的外键, 一个表里可以有多个外键,也可以没有外键;
被指向的实体称为主实体(主表),也叫父实体(父表),负责指向的实体称为从实体(从表),也叫子实体(子表)。
一般在哪个表里定义外键,这个表就是子表
在创建的时候应该先创建主表,然后再创建从表, 插入数据时也应该先插入主表数据
在删除表的时候应该先删除从表(子表), 然后再删除主表
设置级联操作
在主表发生数据改变时,与之相关的从表应该要怎么处理
可以使用关键词on update, on delete来标识
允许的级联操作有:
- cascade: 如果主表更新或者删除数据时,那么从表也会执行相应的操作
- set null: 如果主表更新或者删除数据时, 那么从表相应的数据会设置成null
- restrict: 拒绝主表的操作(默认)
/*删除主表信息时,从表相应的字段设置为null(该字段定义时能为null)*/ Alter table student add foreign key (class_id) references class (class_id) On delete set null
/*主表执行删除或更新时,从表执行同样的操作*/ alter table student add foreign key (class_id) references class (class_id) on delete cascade on update cascade