ITPub博客

首页 > 数据库 > MySQL > Innodb引擎的外键约束

Innodb引擎的外键约束

原创 MySQL 作者:小亮520cl 时间:2015-03-19 14:58:56 0 删除 编辑
外键约束
MySQL 支持外键的存储引擎只有 InnoDB, 在创建外键的时候, 要求父表必须有对应的
索引 , 子表在创建外键的时候也会自动创建对应的索引 。

下面是样例数据库中的两个表, country 表是父表, country_id 为主键索引 , city 表是子
表, country_id 字段对 country 表的 country_id 有外键。

CREATE TABLE country (
country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
country VARCHAR(50) NOT NULL,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (country_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE city (
city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
city VARCHAR(50) NOT NULL,
country_id SMALLINT UNSIGNED NOT NULL,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (city_id),    ---主键
KEY idx_fk_country_id (country_id),  ---索引
CONSTRAINT `fk_city_country` FOREIGN KEY (country_id) REFERENCES country (country_id)   ---外键
ON DELETE RESTRICT ON UPDATE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

在创建索引的时候, 可以指定在删除、 更新父表时, 对子表进行的相应操作, 包 RESTRICT、CASCADE、 SET NULL 和 NO ACTION。
RESTRICT 和 NO ACTION 相同, 是指限制在子表有关联记录的情况下父表不能更新;
CASCADE 表示父表在更新或者删除时, 更新或者删除子表对应记录;
SET NULL 则表示父表在更新或者删除的时候, 子表的对应字段被 SET NULL。
选择后两种方式的时候要谨慎, 可能会因为错误的操作导致数据的丢失。
       例如对上面创建的两个表, 子表的外键指定是 ON DELETE RESTRICT ON UPDATE CASCADE方式的, 那么在主表删除记录的时候, 如果子表有对应记录, 则不允许删除, 主表在更新记录的时候, 如果子表有对应记录, 则子表对应更新:

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29096438/viewspace-1466051/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: oracle等待事件
请登录后发表评论 登录
全部评论
毕业以后专业任职数据库工程师职位,itpub一直作为自己的笔记记录的地方,blog写的不详细,草书笔记,仅供参考!

注册时间:2013-09-12

  • 博文量
    529
  • 访问量
    1126999