MySQL外键约束On Delete、On Update各取值的含义
来源:互联网 发布:javascript 创建对象 编辑:程序博客网 时间:2024/06/05 05:14
主键、外键和索引的区别?
主键外键索引定义:唯一标识一条记录,不能有重复的,不允许为空表的外键是另一表的主键, 外键可以有重复的, 可以是空值
主索引(由关键字PRIMARY定义的索引),用于表的主键上,不可重复,不可为空;
普通索引(由关键字KEY或INDEX定义的索引)可以重复;
唯一索引(由关键字UNIQUE定义的索引),不可重复,但可以有多个空值
作用:用来保证数据完整性用来和其他表建立联系用的是提高查询排序的速度个数:主键只能有一个一个表可以有多个外键一个表只能有一个主索引,可以有多个其它类型索引附:MySQL索引类型介绍
先看On Delete属性,可能取值如上图为:No Act
当取值为No Act
当取值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。
当取值为Set Null时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。
当取值为No Act
当取值为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),而应该先删除外键,之后才可以删除。
- MySQL外键约束On Delete、On Update各取值的含义
- MySQL外键约束On Delete、On Update各取值的含义
- MySQL外键约束On Delete、On Update各取值的含义
- Mysql 外键约束 on delete和on update
- Mysql 外键约束 on delete和on update
- MySQL外键约束On Delete和On Update的使用
- MySQL外键约束On Delete和On Update的使用
- MySQL外键约束On Delete和On Update的详解
- Mysql外健约束on update,on delete
- mysql SQL设置外键约束ON DELETE CASCADE
- MySQL 设置cascade on delete on update
- FOREIGN KEY 约束的ON UPDATE CASCADE 和 ON DELETE CASCADE
- oracle 建立外键约束时on delete cascade 和 on delete set null
- on update cascade 和on delete cascade 的作用
- on update cascade 和on delete cascade 的区别
- 数据库外键定义可选项on update 和on delete 作用
- ON DELETE CASCADE ON UPDATE CASCADE
- ON UPDATE CASCADE ON DELETE CASCADE
- mysql多对多的关系如何表示(主键也可做外键)
- mysql数据库中外键的级联删除功能
- Android Binder: TranscationTooLargeException分析
- Mysql中的Cascade,NO ACTION,Restrict,SET NULL几种功能说明
- OpenCV-009:识别摄像头图像中的指定颜色并显示
- MySQL外键约束On Delete、On Update各取值的含义
- 数据库设计中是设计联合主键还是唯一索引+单一主键好?
- 基于激光混沌同步的高速随机数产生及其图像安全传输应用
- 由localtime引发的函数可重入问题
- typedef的使用说明
- Got a packet bigger than \'max_allowed_packet\' bytes问题排除
- 【MySQL】查看MySQL配置文件路径及相关配置
- sbuf.st_size 为负数
- C语言 struct结构体的变量声明加冒号