资讯专栏INFORMATION COLUMN

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

avwu / 1457人阅读

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

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

父表和子表

当两个表建立一对多关系的时候,"一"的那一端是父表,"多"的那一端是子表。
父表设置一个主键
子表设置一个外键
外键与主键相关联
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——约束

    摘要:其它操作删除主键约束表名添加主键表名列名修改列为主键表名列名数据类型外键约束外键约束是保证一个或两个表之间的参照完整性保持数据一致性。 一. 关系型数据库 市场上主流的关系型数据库:Oracle、DB2、Sybase 、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL。关系型数据库有三大完整性: 实体完整性:实体属性中的标识...

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

    摘要:其它操作删除主键约束表名添加主键表名列名修改列为主键表名列名数据类型外键约束外键约束是保证一个或两个表之间的参照完整性保持数据一致性。 一. 关系型数据库 市场上主流的关系型数据库:Oracle、DB2、Sybase 、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL。关系型数据库有三大完整性: 实体完整性:实体属性中的标识...

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

    摘要:其它操作删除主键约束表名添加主键表名列名修改列为主键表名列名数据类型外键约束外键约束是保证一个或两个表之间的参照完整性保持数据一致性。 一. 关系型数据库 市场上主流的关系型数据库:Oracle、DB2、Sybase 、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL。关系型数据库有三大完整性: 实体完整性:实体属性中的标识...

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

    摘要:约束约束保证数据的完整性和一致性。约束分为表级约束和列级约束。父表子表所参照的表。外键列不存在索引的话,自动创建索引外键约束的参照操作这四个选项是指在在进行了外键约束的创建以后,在更新表的时候,子表是否也进行相应的操作。 showImg(https://segmentfault.com/img/bVSOus?w=1072&h=468); 约束 约束保证数据的完整性和一致性。 约束分...

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

    摘要:上一篇文章第节关系操作级联是在一对多关系中父表与子表进行联动操作的数据库术语。注意级联独立于本身针对外键的级联定义。代码执行后数据库表中的内容的变化表五年二班理想路号楼表理想男静安区女静安区小马哥女闸口区张三韩永跃男静安区 上一篇文章:Python-SQLAlchemy:第3节:关系操作 级联是在一对多关系中父表与子表进行联动操作的数据库术语。因为父表与子表通过外键关联,所以对父表或...

    henry14 评论0 收藏0

发表评论

0条评论

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