您的位置:首页 > 数据库 > MySQL

mysql _外键、实体关系与ER图

2018-01-16 22:04 489 查看


外键约束
概念: A实体的某个字段指向 B实体的主键, 则称A实体的那个字段为该实体的外键, 一个表里可以有多个外键

drop table if exists class;
create table class(
class_no int(2) unsigned zerofill primary key auto_increment comment '班级编号',
class_name varchar(30) not null comment '班级名称'
);
insert into class values(1, '培优班');
insert into class values(2, '普通班');

drop table if exists student;
create table student(
stu_no int(2) unsigned zerofill primary key auto_increment comment '学员编号',
stu_name varchar(30) not null comment '学员姓名',
stu_sex varchar(3) not null comment '学员性别',
stu_age tinyint(2) unsigned zerofill comment '学员年代',
class_no int(2) unsigned zerofill comment '所在班级编号',
foreign key(class_no) references class(class_no)
);
insert into student values(01, '李白', '男', 18, 01);
insert into student values(02, '杜甫', '男', 20, 01);
insert into student values(03, '张飞', '男', 32, 02);
insert into student values(04, '韩信', '男', 26, 02);
insert into student values(05, '了龙', '男', 27, 02);
insert into student values(06, '大乔', '女', 17, 01);
insert into student values(07, '小乔', '女', 16, 01);
insert into student values(08, '胖胖', '男', 18, 03);     --报错,class表里没有class_no为03的数据

ps: 一个表(student)字段(class_no) 指向另一个表class的主键(class_no), 那么student表的class_no就是外键
被指向的表称为主表(父表), 在这里也就是class表
负责指向的表称为从表(子表), 在这里也是student表
ps: 在创建的时候应该先创建主表,然后再创建从表, 插入数据时也应该先插入主表数据
ps: 在删除表的时候应该先删除从表(子表), 然后再删除主表

例:show create table student\G;    --可以通过查看表的创建信息来查看外键名
例: alter table student drop foreign key student_ibfk_1;    --删除外键  student_ibfk_1(外键名)
例: alter table student add constraint stu_fk_class foreign key(class_no) references class(class_no);   --创建一个外键
例: alter table student drop foreign key stu_fk_class;

设置级联操作
意思是在主表发生数据改变时,与之相关的从表应该要怎么处理
可以使用关键词on update, on delete来标识
允许的级联操作有:
cascade: 如果主表更新或者删除数据时,那么从表也会执行相应的操作
set null: 如果主表更新或者删除数据时, 那么从表相应的数据会设置成null
restrict: 拒绝主表的操作(默认)

(on update restrict   --拒绝主表的操作(默认))
alter table student add constraint stu_fk_class foreign key(class_no) references class(class_no) on update restrict;
**********************************************************************************************************************************

(on update cascade   --如果主表更新或者删除数据时,那么从表也会执行相应的操作)
alter table student add constraint stu_fk_class foreign key(class_no) references class(class_no) on update cascade;
update class set class_no = 3 where class_no = 1;
**********************************************************************************************************************************

(on update set null   --如果主表更新或者删除数据时, 那么从表相应的数据会设置成null)
alter table student add constraint stu_fk_class foreign key(class_no) references class(class_no) on update set null;
update class set class_no = 1 where class_no = 3;
**********************************************************************************************************************************

alter table student add constraint stu_fk_class foreign key(class_no) references class(class_no) on delete restrict;
delete from class where class_no = 1;
**********************************************************************************************************************************

alter table student add constraint stu_fk_class foreign key(class_no) references class(class_no) on delete cascade;
delete from class where class_no = 1;
**********************************************************************************************************************************

alter table student add constraint stu_fk_class foreign key(class_no) references class(class_no) on delete set null;
delete from class where class_no = 2;
**********************************************************************************************************************************

实体关系模型
实体模型它有三种成分: 实休,关系,属性
什么实体: 比如一个学生,老师,一个教室等等这些就是实体,比如在student表里每一行数据表示的就是每一个实体的信息
什么属性: 属性就是实体的属性,比如学生的年龄,性别
什么关系: 关系则是实体之间的主从关系,比如一个学生与班级的关系

实体之间有三种关系
一对一关系(1:1)
如果实体集(表)A 中的每一个实休(就是每行记录),在实体集B中只有一条数据与它对应(联系);
反之实体集B 中的每一个实体,在实体A中只有一条数据与它对应
这样的实体关系主是一对一关系

一对多关系(1:n)
如果实体集A中每一个实体,在实体集B中有n个与之对应
反之在实体集B中每一个实体,在实体集A中最多只有一个实体与之对应
这样的实体就是一对多关系

多对多关系(m:n)
如果实体集A中每一个实体,在实体集B中有n个与之对应
反之如果实体集B中每一个实体,在实体集A中也有n个与之对应
这样的实体关系就是多对多关系


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: