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

最新文章

  1. 关于selenium截图
  2. AngularJS中的指令
  3. json 递归查找某个节点
  4. CSS code snip enjoy.
  5. java String的比较,BOX装箱拆箱,以及面向对象的小代码
  6. 【集训笔记】母函数【母函数模板】【HDOJ1028【HDOJ1085
  7. 在docker中初次体验.net core 2.0
  8. Android Studio下HierarchyViewer的使用
  9. Scala学习(八)练习
  10. docker单机网络类型
  11. PythonStudy——比较运算符 Comparison operator
  12. docker运行中的container怎么修改之前run时的env
  13. 20165316 实验一 Java开发环境的熟悉
  14. SPSS-聚类分析
  15. JDK提供的四种线程池代码详解
  16. CF933A A Twisty Movement
  17. 显示AVI文件的桢数
  18. opencv的基本数据结构(一)(转)
  19. JMeter学习笔记--JMeter前置处理器
  20. 【转】input file accept属性可以限制的文件类型

热门文章

  1. create-react-app找不到配置项
  2. C++ VS编译问题--VS下生成DLL,但没有生成Lib的解决办法
  3. dialog problem overview
  4. OutputStream-InputStream-FileOutputStream-FileInputStream-BufferedOutputStream-BufferedInputStream-四种复制方式-单层文件夹复制
  5. 【Leetcode】【Medium】Linked List Cycle II
  6. 为某个云服务设置RVIP
  7. C# 转换运算符:implicit(隐式),explicit(显示)
  8. FQDN说明
  9. ORACLE_TO_CHAR Function
  10. 沉淀,再出发:Maven的使用和规范