主键、外键和索引的区别?

主键

外键

索引

定义:

唯一标识一条记录,不能有重复的,不允许为空

表的外键是另一表的主键,外键可以有重复的,可以是空值

主索引(由关键字PRIMARY定义的索引),用于表的主键上,不可重复,不可为空;

普通索引(由关键字KEY或INDEX定义的索引)可以重复;

唯一索引(由关键字UNIQUE定义的索引),不可重复,但可以有一个空值

作用:

用来保证数据完整性

用来和其他表建立联系用的

是提高查询排序的速度

个数:

主键只能有一个

一个表可以有多个外键

一个表只能有一个主索引,可以有多个其它类型索引

MySQL外键约束On Delete、On Update各取值的含义

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

mysql on delete关键字_MySQL外键约束On Delete、On Update各取值的含义相关推荐

  1. MySQL外键约束On Delete、On Update各取值的含义

    主键.外键和索引的区别?   主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...

  2. mysql外键关联查询_MySQL外键约束和多表联查

    一.创建外键 #测试数据表 # 教师表,主表 CREATE TABLE teacher( id INT PRIMARY KEY AUTO_INCREMENT, name varchar(20), ag ...

  3. mysql级联删除外键约束_MySQL外键约束、级联更新、级联删除

    MySQL支持外键(foreign key),外键允许跨表交叉引用相关数据,另外外键约束能够保证相关数据的一致性.一个外键关系通常包括一个父表和一个子表.父表包含原始的字段数据,子表引用父表中该字段的 ...

  4. MySQL—表的完整性约束(外键约束)(二)

    1.班级表 2.学生表 例1:删除班级5:如果直接删除的话肯定不行,因为有外键约束 delete from t_class where cno=5; 1451 - Cannot delete or u ...

  5. mysql另外加外键约束怎么写_mysql外键约束怎么写

    mysql外键约束的写法:[[CONSTRAINT ] FOREIGN KEY 字段名 REFERENCES 主键列1].外键约束是表的一个特殊字段,经常与主键约束一起使用. 在 CREATE TAB ...

  6. mysql cluster 外键_Mysql外键约束

    Mysql集群创建外键,分为四种约束:no action,restrict,cascade,set null.如果表A的主关键字是表B中的字段,则该字段称为B的外键,表A称为主表,表B称为从表.外键是 ...

  7. mysql外键_MySQL外键约束(FOREIGN KEY)

    MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用.对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表). 外键用 ...

  8. MySQL外键约束_ON DELETE CASCADE/ON UPDATE CASCADE

    MySQL通过外键约束实现数据库的参照完整性,外键约束条件可在创建外键时指定,table的存储引擎只能是InnoDB,因为只有这种存储模式才支持外键. 外键约束条件有以下4种: (1)restrict ...

  9. mysql on cascade_MySQL外键约束_ON DELETE CASCADE/ON UPDATE CASCADE

    MySQL通过外键约束实现数据库的参照完整性,外键约束条件可在创建外键时指定,table的存储引擎只能是InnoDB,因为只有这种存储模式才支持外键. 外键约束条件有以下4种: (1)restrict ...

最新文章

  1. [Python] 中文路径和中文文本文件乱码问题
  2. 身份管理软件公司Okta计划IPO,目标融资1亿美元
  3. SignalR Self Host+MVC等多端消息推送服务(4)
  4. 东财mysql数据库系统及应用_2020秋东财《MySQL数据库系统及应用》单元作业一
  5. 获江苏国资阿里小米等入股 苏宁易购复牌涨停
  6. PHP 收货地址:添加、修改、删除
  7. python简单爬虫代码-Python爬虫――写出最简单的网页爬虫
  8. java 随机抽取数组内容_工具类:随机抽取数组或集合中的几个不重复元素
  9. jetbrains验证服务器,搭建个人jetbrains授权服务器
  10. 联想E43升级bios激活windows 7
  11. 链家混三个月底薪_应届毕业生入职链家,到离职
  12. r如何打开计算机窗口,如何进入运行窗口
  13. winscp是什么软件_文件传输软件WinSCP的使用
  14. 5.3 10篇美食类小红书爆文拆解【玩赚小红书】
  15. c1TrueDBGrid在C#中的研究
  16. 找完数——完数的使用
  17. perl中grep用法总结
  18. 系统服务器选型依据,1.2 服务器选型原则
  19. cf768g The Winds Of Winter
  20. java-net-php-python-springtboot校园信息交流互助系统计算机毕业设计程序

热门文章

  1. C/C++基础知识点(四)
  2. 【已解决】R read.table()报错:incomplete final line found by readTableHeader
  3. C语言中返回错误信息的函数总结
  4. 汇编程序.c到a.out的生命历程
  5. 4.6 计算机网络之网络层IP组播(IGMP、组播路由选择协议、组播地址)
  6. 104. 软件工程的开发过程几种模型(瀑布模型、快速原型开发模型、增量模型、迭代模型、螺旋模型)
  7. japidocs怎么设置参数必填_JApiDocs 动态生成接口文档,并解析java 源码中的注释...
  8. 用python定义一个员工类_python3 类的定义
  9. C语言的实现经过(C代码到CPU执行)
  10. java 反射应用_java反射(二)--反射应用案例