MySQL外键约束

Delete//删除

Update//更新


On Delete属性,可能取值如上图为:No Action(Restrict), 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),而应该先删除外键,之后才可以删除。


http://blog.sina.com.cn/s/blog_7187e24301019rcr.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值