数据库学习笔记和小练习(16)外键再理解

一、外键

在关系型数据库中,基本的对象就是表(关系),每个表都维护了一定的信息。但是,生活中的信息不是简单地,分离的,信息之间一定会有着这样那样的联系,相对应的,我们的表之间也应该有所联系。

举个例子:学生表在我们前面的例子中出现的不少,它描述了学生信息,比如包括了他所在系,那么,它所在的系就确定了。但是是不是一个系名就完全描述了这个系的信息呢?显然是不够的,比如系主任的名字等等关于系的信息,这一部分信息不应该放在学生表中,而应该在一个描述系信息的表中。但是,学生表可能会需要系的一些详细信息(它们的信息确实是相关联的)

所以对于学生表的一个属性(系),通过这个属性可以联系到一个系表(要求系在系表中是主键)否则,这种联系是不唯一是混乱的(一个学生不可能在两个系)。

所以:如果公共关键字在一个关系中是主键,那么这个公共关键字被称为另一个关系的外键(一张表的一个非主键字段指向另一张表的主键)。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表(父表)(被参照表),具有此外键的表被称为主表的从表(子表)(参照表)。

在这个关系中:我们的子表(参照表)参照父表(被参照表),也即是说,现在是子表(学生表)需要父表(系表),被需要的人往往更被依赖,更有地位,也更有责任(就像父亲一样),而这种关系也将产生外键约束

创建外键:


CREATE TABLE SPJ
(
SNO CHAR(3),
PNO CHAR(3),
JNO CHAR(3),
QTY INT,
primary key(SNO,PNO,JNO),
foreign key (SNO) references S(SNO),

foreign key (PNO) references P(PNO),foreign key (JNO) references J(JNO))charset gbk;

基本语法: foreign key  (本张表中的那个非主键) references 被参照表(被参照表的被参照列,也是被参照表的主键)。

增加外键:

alter table 表名 add
[constraint 外键名字]
foreign key(外键字段)
references 父表(主键字段)


[constraint 外键名字]可选,可以给外键取名字。

修改外键:
外键不可修改,只能先删除后新增

alter table 表名 drop
foreign key
外键名;


#注意:

子表外键的字段类型和父表主键的字段类型需要相同(列名不一定相同)
一张表可以有多个外键(但是名字不能相同)

二、外键约束

把握住一个核心父表不能比子表小(父表子表通过外键是一一关联的,也即是说不能有子表有,父表没有的情况)
所以:子表插入父表没有的记录会失败,否则子表就比父表大了。(学生在一个不存在的系)
所以:子表更新后的记录父表没有会失败,否则子表就比父表大了(学生改到了一个不存在的系)
所以:父表不能删除一个子表有的记录,否则父表就比子表小了(学生都没系了)
所以:父表更新一个记录,导致子表有记录在父表中找不到公共属性值相等的记录,否则父表就比子表小了(有学生没系)
小结:我们有可能有一个系却没有学生,也即是说以上操作反之能成立,比如父表插入(父表比子表大)
但是却不可能一个系都不存在,有学生却是这个不存在的系的。

#注意

以上不允许的操作发生的时候,默认拒绝操作(DIstrict)但是也可能:
1.级联操作(Cascade)
比如删除\更新一个系,把原来学生表中对应系的记录全部删除\更新
2.设置为空值(set null)
比如删除\更新一个系,把原来学生表中对应系的记录的外键设置为空(表示系已删除)
(外键字段如果是联合主键的一部分,是不能被置空的,即前提条件是可以置空)
(指定的时候不满足,会无法创建)
以上在创建外键的时候指明:

foreign key (主键字段) references 父表(主键字段)
on delete set null
on update cascade,

删除的时候置空,更新的时候级联操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值