资讯专栏INFORMATION COLUMN

mysql之外键约束(级联操作等) 父表子表

avwu / 1015人阅读

摘要:目前只有引擎类型支持外键约束。外键约束使用最多的两种情况无外乎父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败父表更新时子表也更新,父表删除时子表匹配的项也删除。

不理解的地方标注问号。
网上不同的博客讲的,之间似乎有些矛盾,求推荐好书。
写得不好请指出错误。

父表和子表

当两个表建立一对多关系的时候,"一"的那一端是父表,"多"的那一端是子表。
父表设置一个主键
子表设置一个外键
外键与主键相关联
B表引用A表的字段作为外键,那么A表是主表,B表是从表。

举例:
由于选课表中用到了学生表中的学生ID字段(用来与学生表进行关联,获得学生的信息),并且用到了课程表中的课程ID字段(用来与课程表进行关联,获得课程的信息),
通过上面的分析得,选课表是子表,学生表与课程表都是它的父表】

讲解1

http://www.cnblogs.com/ribavn...

MySQL有两种常用的引擎类型:MyISAM和InnoDB。目前只有InnoDB引擎类型支持外键约束。InnoDB中外键约束定义的语法如下:

[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]

reference_option:

RESTRICT | CASCADE | SET NULL | NO ACTION

外键的使用需要满足下列的条件:

两张表必须都是InnoDB表,并且它们没有临时表。

建立外键关系的对应列必须具有相似的InnoDB内部数据类型。

建立外键关系的对应列必须建立了索引。

假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。

如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。
如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。"InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:"

CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新子表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。

SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。

NO ACTION: InnoDB拒绝删除或者更新父表。 ?有点不理解

RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。 ?

SET DEFAULT: InnoDB目前不支持。

外键约束使用最多的两种情况无外乎:

1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;

2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

前一种情况,在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;后一种情况,可以使用ON UPDATE CASCADE ON DELETE CASCADE。

InnoDB允许你使用ALTER TABLE在一个已经存在的表上增加一个新的外键:

ALTER TABLE tbl_name

ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]

InnoDB也支持使用ALTER TABLE来删除外键:

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

讲解

作者:匿名用户
链接:https://www.zhihu.com/questio...
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

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

2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;

3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;

外键的定义语法:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。

ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT(限制外表中的外键改动) 是外表不能改外键的意思吗?
CASCADE(跟随外键改动) 外表中外键改了,原表也会改吗?
SET NULL(设空值) 这个描述是什么意思?
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/46820.html

相关文章

  • MySQL——约束

    ...完整性:实体属性中的标识属性不能为空、不能重复,该约束通过制定的主实现,其约束有系统强制实施 参照完整性:实体中的外可以为空,但不能是错的。 用户定义完整性:某一具体的实际数据库的约束条件,由应用环...

    voidking 评论0 收藏0
  • MySQL——约束

    ...完整性:实体属性中的标识属性不能为空、不能重复,该约束通过制定的主实现,其约束有系统强制实施 参照完整性:实体中的外可以为空,但不能是错的。 用户定义完整性:某一具体的实际数据库的约束条件,由应用环...

    Lemon_95 评论0 收藏0
  • MySQL——约束

    ...完整性:实体属性中的标识属性不能为空、不能重复,该约束通过制定的主实现,其约束有系统强制实施 参照完整性:实体中的外可以为空,但不能是错的。 用户定义完整性:某一具体的实际数据库的约束条件,由应用环...

    lyning 评论0 收藏0
  • MySQL学习记录:约束以及修改数据表

    约束 约束保证数据的完整性和一致性。 约束分为表级约束和列级约束。 只针对某一个字段 列级约束 针对两个或两个以上的字段 表级约束 约束类型包括: NOT NULL(非空约束) PRIMARY KEY(主约束) UNIQUE KEY(唯一...

    ygyooo 评论0 收藏0
  • Python-SQLAlchemy:第4节:级联

    上一篇文章:Python-SQLAlchemy:第3节:关系操作 级联是在一对多关系中父表子表进行联动操作的数据库术语。因为父表子表通过外关联,所以对父表子表的增、删、改操作会对另一张表产生相应的影响。适当的利用级...

    henry14 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<