MySQL-1.外键约束

本文主要参考MySQL官方文档博客

外键的创建

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

外键的建立受限于以下几种情况:

  • 外键是定义在子表中的,母表和子表必须是相同的存储引擎,并且二者都不能为临时表
  • 具有外键关系的两个列必须具有相近的数据类型:整形类型符号和长度必须相同;若为字符串类型,两者长度可以不一致;若为二进制字符类型,字符集和比对方法必须一致。
  • 在引用表中,必须有一个索引。外键中的列顺序必须与索引中的列顺序一致(原文中的as the first columns没太看懂),如果该索引不存在,将在引用表里面自动创建。
  • 在被引用表中,也必须有一个索引。
  • 不支持创建索引前缀列的外键。这样的后果之一是BLOB和TEXT列不被包括在一个外键中,这是因为对这些列的索引必须总是包含一个前缀长度。、
  • 如果创建外键时给出了CONDTRAINT symbol值,它必须在数据库中是唯一的;如果创建时未给出,Innodb会自动创建。

外键的约束行为

  • CASCADE:对母表的行执行UPDATE或者DELETE操作,相应的操作会自动同步到子表中。
  • SET NULL:对母表中的行执行UPDATE或者DELETE操作,子表中的相应行的值会被设置为NULL。如果子表中具有外键约束的列被设置为NOT NULL,将会报错。
  • RESTRICT:不允许母表执行UPDATE或者DELETE操作。
  • NO ACTION:在mysql数据库中,等同于RESTRICT。

实例

  1. 创建product表
    这里写图片描述
  2. 创建customer表
    这里写图片描述
  3. 创建product_order表

    外键约束加在了双列索引上面
  4. 通过alter talbe 的方式为表创建外键,但是创建外键之前首先要为相应的列创建索引。
  5. 外键的删除,如果创建外键的时候设置了CONSTRAINT值,可以如下操作:
    这里写图片描述
    如果为设置该值,可以通过show create table product_order\G查看相关值。
    这里写图片描述

其他

  1. mysqldump导入
    在具有外键约束的表中导入数据时,会自动设置foreign_key_checks为0,这样一方面可以加快导入速度;另一方面,可以避免多个表必须按照特定顺序导入的问题。
    另外,将foreign_key_checks设置为0,可以消除在LOAD DATA或者ALTER TABLE操作时的外键约束。但是,该属性值即使为0,在列的数据类型不匹配的情况下也无法创建外键约束,ALTER TABLE也无法为一个拥有外键约束的表更改存储引擎。
  2. 如果foreign_key_checks为1,将无法通过DROP TABLE 来删除一个具有外键约束的表。如果删除该表,创建该表时添加的各种约束也随之删除。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值