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 NULLON UPDATECASCADE

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

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

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

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

UserID

ST001

,而文件表有记录

FileIDFileOwner

1ST001

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • CREATE TABLE IF NOT EXISTS ecs_order_info (order_id mediu...
    cookie口阅读 15,762评论 0 16
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,172评论 6 13
  • MySQL5.6从零开始学 第一章 初始mysql 1.1数据库基础 数据库是由一批数据构成的有序的集合,这些数据...
    星期四晚八点阅读 1,184评论 0 4
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,056评论 0 19
  • 事物-食物皆有独特的韵味! 自从回到港湾,就再也没有下过厨了!还记得那时在远方和朋友一起的日子,每天都会研究各种美...
    流着泪吃糖阅读 235评论 0 1