20.外键

  • • 发表于 6年前
  • • 作者 大妖怪
  • • 10588 人浏览
  • • 1 条评论
  • • 最后编辑时间 6年前
  • • 来自 [技 术]

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

记得在第十三章左联,创建student表的时候说了句,字段class_i是当做一个外键,并不是一个真的外键。那么真的外键又是个啥?
外键属于一种约束,限制你对数据库的操作,它是为了防止因为操作不当产生冗余数据/脏数据的一种约束。删掉几个新增的class_id为3的数据,右键student表,选择设计表。然后创建一个外键,将class_id设为一个外键:


然后保存。
然后,我们去class表删除id为1的数据:

这时候刷新student表,你会发现,student表中的class_id为1的数据一起被删除了:

我们可以找到,设置外键的时候,删除时和新增时都有四个选项:

没错,造成student表中数据被删除的就是删除时的这个CASCADE。这四个选项是事件触发限制,意思分别是:

  • CASCADE: 在父表上update/delete记录时,同步update/delete掉子表的匹配记录
  • SET NULL: 在父表上update/delete记录时,将子表上匹配记录的列设为null
  • NO ACTION: 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
  • RESTRICT: 如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录
  • 除了这四种,还有一个不选择,不选默认是RESTRICT。

以上是通过软件来创建外键,如果通过语句,应该是这样:

CREATE TABLE student(
   id INT NOT NULL AUTO_INCREMENT,
   name VARCHAR(5) NOT NULL,
   gender VARCHAR(1) NOT NULL,
   stu_no VARCHAR(10) NOT NULL,
   class_id INT NOT NULL,
   PRIMARY KEY(id),
   FOREIGN KEY(class_id) REFERENCES class(id)
);

这句话是说引用class表的id字段到student表的class_id字段作为外键,查看外键,可以发现创建出来的外键删除时和更新时都是默认的:

如果想要修改触发限制可以这么做:

CREATE TABLE student(
   id INT NOT NULL AUTO_INCREMENT,
   name VARCHAR(5) NOT NULL,
   gender VARCHAR(1) NOT NULL,
   stu_no VARCHAR(10) NOT NULL,
   class_id INT NOT NULL,
   PRIMARY KEY(id),
   FOREIGN KEY(class_id) REFERENCES class(id) ON DELETE CASCADE ON UPDATE CASCADE
);

之所以把外键放到最后,是因为平时写程序不太喜欢使用这种方式,用得非常少,我也不是太会,因为有时候觉得数据库限制得太强了不太自由,相比之下我本人更喜欢在程序中维护数据的一致性。那个,对于外键这块,我先干了,你们随意。
emmm,mysql的基础到此结束了,还有啥索引什么的,以后遇到了讲讲。后面的内容不定期更新,也都是零散讲一些技巧。

分享到:
1条评论
Ctrl+Enter
作者

大妖怪

大妖怪

APP:1 帖子:76 回复:200 积分:7517

已加入社区[2943]天

梦里巷口,可有你倚门回首

作者详情》
Top