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

    转载地址:http://hi.baidu.com/jxqlovejava/item/3d2cc5b5d689917c244b0920

    先看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),而应该先删除外键,之后才可以删除。

  • 相关阅读:
    el-select下拉框选项太多导致卡顿,使用下拉框分页来解决
    vue+elementui前端添加数字千位分割
    Failed to check/redeclare auto-delete queue(s)
    周末啦,做几道面试题放松放松吧!
    idea快捷键
    解决flink运行过程中报错Could not allocate enough slots within timeout of 300000 ms to run the job. Please make sure that the cluster has enough resources.
    用.net平台实现websocket server
    MQTT实战3
    Oracle 查看当前用户下库里所有的表、存储过程、触发器、视图
    idea从svn拉取项目不识别svn
  • 原文地址:https://www.cnblogs.com/csshaw/p/3777435.html
Copyright © 2011-2022 走看看