zoukankan      html  css  js  c++  java
  • Mysql外键约束设置使用方法

     技术交流加微信
    如果表A的主关键字是表B中的字段,则该字段称为表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)创建表: 代码如下 复制代码 -- -- http://www.111cn.net 原创 -- 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 AUTO_INCREMENT=2 ; INSERT INTO `article` (`id`, `category_id`, `name`) VALUES (1, 1, '文章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 AUTO_INCREMENT=2 ; INSERT INTO `category` (`id`, `name`) VALUES (1, '分类1'); 创建外键约束: 代码如下 复制代码 ALTER TABLE `article` ADD CONSTRAINT `fk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`); (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;
  • 相关阅读:
    oracle的安装与plsql的环境配置
    Working with MSDTC
    soapui-java.lang.Exception Failed to load url
    Oracle 一个owner访问另一个owner的table,不加owner
    Call API relation to TLS 1.2
    Call API HTTP header Authorization: Basic
    VS2008 .csproj cannot be opened.The project type is not supported by this installat
    The changes couldn't be completed.Please reboot your computer and try again.
    Create DB Table View Procedure
    DB Change
  • 原文地址:https://www.cnblogs.com/musings/p/5913269.html
Copyright © 2011-2022 走看看