zoukankan      html  css  js  c++  java
  • MySQL外键约束On Delete、On Update各取值的含义

    主键、外键和索引的区别?

      主键 外键 索引
    定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键外键可以有重复的可以是空值

    主索引(由关键字PRIMARY定义的索引),用于表的主键上,不可重复,不可为空;

    普通索引(由关键字KEY或INDEX定义的索引)可以重复;

    唯一索引(由关键字UNIQUE定义的索引),不可重复,但可以有一个空值

    作用: 用来保证数据完整性 用来和其他表建立联系用的 是提高查询排序的速度
    个数: 主键只能有一个 一个表可以有多个外键 一个表只能有一个主索引,可以有多个其它类型索引

    附:MySQL索引类型介绍

    MySQL外键约束On Delete、On Update各取值的含义

    先看On Delete属性,可能取值如上图为:No Action, Cascade,Set Null, Restrict属性。

    当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。

    当取值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。

    当取值为Set Null时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。

    On Update是一样的,


    当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新。

    当取值为Cascade时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也更新外键在子表(即包含外键的表)中的记录。

    当取值为Set Null时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。

    比如我有这样两张表:

    tbluser用户表:

    DROP TABLE IF EXISTS `filedb`.`tbluser`;

    CREATE TABLE  `filedb`.`tbluser` (

      `UserID` varchar(50) NOT NULL COMMENT '主键',

      `UserName` varchar(40) NOT NULL COMMENT '用户姓名',

      `UserMail` varchar(50) NOT NULL COMMENT '用户邮箱',

      `UserPassword` varchar(50) NOT NULL COMMENT '密码',

      `UserType` tinyint(3) unsigned DEFAULT '0' COMMENT '默认为0,表示普通用户',

      `UserCreated` datetime DEFAULT '0000-00-00 00:00:00',

      PRIMARY KEY (`UserID`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    ----------------------------------------------------------------------------------------------------------------

    tblfile文件(用户的文件)表:

    DROP TABLE IF EXISTS `filedb`.`tblfile`;

    CREATE TABLE  `filedb`.`tblfile` (

      `FileID` int(10) unsigned NOT NULL AUTO_INCREMENT,

      `FileOwner` varchar(50) DEFAULT NULL COMMENT '外键,引用用户表',

      `FileName` varchar(200) NOT NULL COMMENT '文件原始名称',

      `FilePath` varchar(200) NOT NULL COMMENT '文件存放路径',

      `FileType` varchar(10) NOT NULL COMMENT '文件类型',

      `FileSubject` varchar(100) NOT NULL COMMENT '文件标题',

      `FileCreated` datetime DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',

      PRIMARY KEY (`FileID`),

      KEY `FK_tblfile_1` (`FileOwner`),

      CONSTRAINT `FK_tblfile_1` FOREIGN KEY (`FileOwner`) REFERENCES `tbluser` (`UserID`) ON DELETE SET NULL ON UPDATE CASCADE 

    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

    -------------------------------------------------------------------------------------------------

    上面可以看出FileOwner是文件表的外键,引用的是用户表的UserID。且这里外键约束设置为"ON DELETE SET NULL ON UPDATE CASCADE " 

    现在用户表有记录(省略其他无关的字段):

    UserID

    ST001

    ,而文件表有记录

    FileID   FileOwner

    1          ST001

    那么如果我删除用户表中ST001对应记录时,则根据ON DELETE SET NULL规则,文件表中FileOwner应该被设置为null,动手尝试后也确实如此;如果我将用户表中ST001改为ST003,则根据ON UPDATE CASCADE规则,文件表中FileOwner应该连锁设置为ST003,也的确如此。

    外键的使用对于减少数据库冗余性,以及保证数据完整性和一致性有很大作用。

    另外注意,如果两张表之间存在外键关系,则MySQL不能直接删除表(Drop Table),而应该先删除外键,之后才可以删除。

    From: http://hi.baidu.com/jxqlovejava/item/3d2cc5b5d689917c244b0920

  • 相关阅读:
    LUOGU P4113 [HEOI2012]采花
    LUOGU P4251 [SCOI2015]小凸玩矩阵
    bzoj 3230 相似子串——后缀数组
    bzoj 4453 cys就是要拿英魂!——后缀数组+单调栈+set
    洛谷 5061 秘密任务——二分图染色
    bzoj 4104 [Thu Summer Camp 2015]解密运算——思路
    bzoj 4319 cerc2008 Suffix reconstruction——贪心构造
    poj 3415 Common Substrings——后缀数组+单调栈
    CF 504E Misha and LCP on Tree——后缀数组+树链剖分
    bzoj 4278 [ONTAK2015]Tasowanie——后缀数组
  • 原文地址:https://www.cnblogs.com/imxiu/p/3467548.html
Copyright © 2011-2022 走看看