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

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

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

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

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



    当取值为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),而应该先删除外键,之后才可以删除

  • 相关阅读:
    [算法] 堆栈
    [刷题] PTA 02-线性结构3 Reversing Linked List
    java IO流 (八) RandomAccessFile的使用
    java IO流 (七) 对象流的使用
    java IO流 (六) 其它的流的使用
    java IO流 (五) 转换流的使用 以及编码集
    java IO流 (四) 缓冲流的使用
    java IO流 (三) 节点流(或文件流)
    java IO流 (二) IO流概述
    java IO流 (一) File类的使用
  • 原文地址:https://www.cnblogs.com/liaojie970/p/8422909.html
Copyright © 2011-2022 走看看