zoukankan      html  css  js  c++  java
  • mysql外键约束

    02-mysql外键约束.md

    如果表A(category.id) 的主关键字是 表B(article.category_id) 中的字段,则该字段称为表B的外键,表A称为主表(父表),表B称为从表(子表)。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。外键主要用来保证数据的完整性和一致性,两个表必须是InnoDB表,MyISAM表暂时不支持外键,外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;

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

    创建外键语法:

    代码如下

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

    1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新子表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。
    2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
    3. NO ACTION: InnoDB拒绝删除或者更新父表。
    4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
    5. SET DEFAULT: InnoDB目前不支持。

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

    1. 父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;
    2. 父表更新时子表也更新,父表删除时子表匹配的项也删除。
    • 前一种情况,在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;
    • 后一种情况,可以使用ON UPDATE CASCADE ON DELETE CASCADE。

    使用案例:

    (1)创建表:

    # 创建分类表 CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` char(16) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 # 插入记录 INSERT INTO `category` (`id`, `name`) VALUES (1, '分类1'); # 创建文章表 CREATE TABLE IF NOT EXISTS `article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `category_id` int(11) NOT NULL, `name` char(16) NOT NULL, PRIMARY KEY (`id`), KEY `fk_1` (`category_id`)-- 创建索引 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 # 插入记录 INSERT INTO `article` (`id`, `category_id`, `name`) VALUES (1, 1, '文章1'); # 设置外键约束 ALTER TABLE `article` ADD CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`);

    此时并没有指定哪种动作,默认是RESTRICT 也就是说,在默认情况下是不允许删除主表或更新主表的数据的

    2)删除主表category中数据:

    delete FROM `category` WHERE id=1 

    ,会报错:

    #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`article`, CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`))

    3)从表article中,添加不存在的category_id:

    insert into article(category_id,name) values(2,'分类2') 会报错: #1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`article`, CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`))

    (4)更改更新删除约束

    --删除外键

    ALTER TABLE article DROP FOREIGN KEY fk_1

    添加外键

    ALTER TABLE `article` ADD CONSTRAINT `fk_1` FOREIGN KEY ( `category_id` ) REFERENCES `category` ( `id` ) ON DELETE CASCADE ON UPDATE CASCADE 

    此时如下操作: 此时article中的记录也会被删除

    delete from category where id=1;

    此时article中的category_id也会被更新成3

    UPDATE `test`.`category` SET `id` = '3' WHERE `category`.`id` =2

  • 相关阅读:
    有点忙啊
    什么是协程
    HDU 1110 Equipment Box (判断一个大矩形里面能不能放小矩形)
    HDU 1155 Bungee Jumping(物理题,动能公式,弹性势能公式,重力势能公式)
    HDU 1210 Eddy's 洗牌问题(找规律,数学)
    HDU1214 圆桌会议(找规律,数学)
    HDU1215 七夕节(模拟 数学)
    HDU 1216 Assistance Required(暴力打表)
    HDU 1220 Cube(数学,找规律)
    HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
  • 原文地址:https://www.cnblogs.com/smilevv/p/13261139.html
Copyright © 2011-2022 走看看