我们都知道在数据库MYSQL当中有三种不同的完整性约束,分别为:实体完整性,参照完整性和用户定义完整性。

直接上干货篇:

通俗的讲:实体完整性是用来约束主键(primary key)和候选键(unique)。                                                  参照完整性是用来约束外键(foreign)的。                                                                                       用户定义完整性基本是用来限制数据 (非空和check)。

而以上的这几种约束又有两种具体的约束方式分别为:列级完整性约束和表级完整性约束。

接下来我们用例子来具体讲述,上实例,这是一张学生信息表和一张班级表,后面我们都将用它来做案例讲解。

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 )  ,studentName VARCHAR ( 20 ) ,sex CHAR ( 2 ),birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 )
) ;
CREATE TABLE IF NOT EXISTS tb_class
(classNo CHAR(6) PRIMARY KEY,className VARCHAR(20) ,department VARCHAR(30) ,grade int,classNum int
);

主键

比如我要把student表中的学生编号(studentNo)定义为主键,列级定义就是直接在后面加上primary key,如下:

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 ) PRIMARY KEY ,studentName VARCHAR ( 20 ) ,sex CHAR ( 2 ),birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 )
) ;

而表级定义则有两种方式,一种是在表未加上primary key()还有一种则是使用constraint语句,如下。PS:为了方便比较我将两个语句放在同一张表中,但实际情况中只有一个即可。

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 ) ,studentName VARCHAR ( 20 ) ,sex CHAR ( 2 ),birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 ),PRIMARY KEY (studeentNO)CONSTRAINT PK_student PRIMARY KEY(studentNO)
) ;

候选键

候选键的话很大程度上和主键是相似的

比如我要把student表中的学生姓名(studentNname)定义为候选键,列级定义就是直接在后面加上unique,如下:

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 ) ,studentName VARCHAR ( 20 ) UNIQUE,sex CHAR ( 2 ),birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 )
) ;

而表级定义则依旧是使用constraint语句,如下。

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 ) ,studentName VARCHAR ( 20 ) ,sex CHAR ( 2 ),birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 ),CONSTRAINT UN_student UNIQUE(studentName)
) ;

如果表里面有多个候选键的话我们只需要在括号里添加列名即可用“,”隔开就行。                        如:  CONSTRAINT UN_student UNIQUE(studentName,sex)

关于主键和候选键还要注意以下几点:

1.一个表中只能定义一个PRIMARY KEY,但可以定义多个UNIQUE。

2.PRIMARY KEY列不允许有空值,而UNIQUE可以有空值。

3.我们在定义PRIMARY KEY和UNIQUE时系统会对其分别产生索引。

外键

外键的作用作用就是连接两表。外键在定义之前还要满足几个要求:

1.必须有两个表即参照表和被参照表。被参照表必须是已用create table创建或者正在被创建的表。如果是后一种情况的话,则被参照表和参照表是同一个表,这样的表被叫做自参照表。

2.外键必须为被参照表上的主键或者候选键。且外键对应列的数目必须和被参照表的主键对应列的数目相同。

3.必须在被参照表的表名后面指定列名或列名的组合,这个列或列组合必须是被参照表的主键或候选键。

4.尽管主键是不能够包含空值的,但允许在外键中出现空值。这意味着,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。

5.外键对应列的数据类型必须和被参照表的主键对应列的数据类型相同

满足这几个要求就可以啦,比如我要把student表中的班级编号(classNo)定义为外键,对应class表中的主键班级编号(classNo),列级定义就是直接在后面加上references,如下:

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 ) ,studentName VARCHAR ( 20 ) ,sex CHAR ( 2 ),birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 ) REFERENCES tb_class(classNo)
) ;

而表级定义则依旧是使用constraint语句,如下。

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 ) ,studentName VARCHAR ( 20 ) ,sex CHAR ( 2 ),birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 ) ,CONSTRAINT FK_student FOREIGN KEY (classNO) REFERENCES tb_class(classNo)
) ;

非空约束

顾名思义就是有些列不能被设置为控制,所以我们对其进行非空约束,这样一旦出现空值的时候系统就会报错。使用方法只有一种如下:

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 ) NOT NULL,studentName VARCHAR ( 20 ) ,sex CHAR ( 2 ),birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 ) ,
) ;

还记得我们的主键不能为空原则嘛,可以联合使用哦,如下:

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 ) NOT NULL PRIMARY KEY,studentName VARCHAR ( 20 ) ,sex CHAR ( 2 ),birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 ) ,
) ;

CHECK约束

check主要是针对数据条件上的约束,也有列级约束和表级约束两种形式。这样说可能有些抽象,那么话不多说了,上实例:

比如我要对student表中的性别(sex)添加一个约束,要求此列只能出现男或者女这两种情况,列级定义就是直接在后面加上check语句,如下:

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 ) ,studentName VARCHAR ( 20 ) ,sex CHAR ( 2 ) CHECK ( sex='男' OR sex='女' ),birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 )
) ;

那我们的表级定义同样是用constraint语句,如下:

CREATE TABLE IF  NOT EXISTS tb_student (studentNo INT ( 10 ) ,studentName VARCHAR ( 20 ) ,sex CHAR ( 2 ) ,birthday date,native VARCHAR ( 20 ),nation VARCHAR ( 10 ) ,classNo CHAR ( 6 ) ,CONSTRAINT CK_student CHECK ( sex='男' OR sex='女' )
) ;

通过我们以上几个例子我们还可以发现:constraint语句的好处就是可以对定义的主键,候选键,外键等等……进行命名。而在目前的MYSQL中我们并没有办法对列级的约束进行命名,所以我们的constraint语句被广泛的欢迎和使用。

我爷爷来了都能看懂的数据库主键,候选键,外键,非空和check的几种约束方式及使用方法相关推荐

  1. 人人都能看懂的EM算法推导

    作者丨August@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/36331115 编辑丨极市平台 估计有很多入门机器学习的同学在看到EM算法的时候会有种种疑惑:EM ...

  2. 《小学生都能看懂的快速沃尔什变换从入门到升天教程》(FWT / FMT / FMI)(最最严谨清晰的证明!零基础也能得学会!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 0x00 卷积 0x01 多项式 0x02 卷积的定义 0x03 卷积的基本性质 0x04 位运 ...

  3. 兄弟,用大白话给你讲小白都能看懂的分布式系统容错架构

    点击上方"蓝字", 右上角选择"设为星标" 周一至周五早11点半!精品文章准时送上! 本文来自石杉的架构笔记 目录 (1)TB级数据放在一台机器上:难啊! (2 ...

  4. 春节充电 | 文科生都能看懂的机器学习教程:梯度下降、线性回归、逻辑回归(附动图解释)...

    来源:新智元 本文约4200字,建议阅读10+分钟. 本文浅显易懂的方式讲解机器学习,力求让没有理科背景的读者都能看懂. [ 导读 ]虽然在Coursera.MIT.UC伯克利上有很多机器学习的课程, ...

  5. 文科生都能看懂的机器学习教程:梯度下降、线性回归、逻辑回归

    来源:新智元 本文约4200字,建议阅读10+分钟. 本文浅显易懂的方式讲解机器学习,力求让没有理科背景的读者都能看懂. [ 导读 ]虽然在Coursera.MIT.UC伯克利上有很多机器学习的课程, ...

  6. 人人都能看懂LSTM

    这是在看了台大李宏毅教授的深度学习视频之后的一点总结和感想.看完介绍的第一部分RNN尤其LSTM的介绍之后,整个人醍醐灌顶.本篇博客就是对视频的一些记录加上了一些个人的思考. 0. 从RNN说起 循环 ...

  7. 小学生都能看懂的FFT!!!

    小学生都能看懂的FFT!!! 前言 在创新实践中心偷偷看了一天FFT资料后,我终于看懂了一点.为了给大家提供一份简单易懂的学习资料,同时也方便自己以后复习,我决定动手写这份学习笔记. 食用指南: 本篇 ...

  8. 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

    一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...

  9. 语言线性拟合线对称_文科生都能看懂的机器学习教程:梯度下降、线性回归、逻辑回归...

    [新智元导读]虽然在Coursera.MIT.UC伯克利上有很多机器学习的课程,包括吴恩达等专家课程已非常经典,但都是面向有一定理科背景的专业人士.本文试图将机器学习这本深奥的课程,以更加浅显易懂的方 ...

最新文章

  1. detection in video and image
  2. 中国楼市场的真相————写在厦门楼市崩盘之后
  3. idea中新建.xml文件找不到选项的解决方法
  4. hadoop漏洞_【漏洞公告】CVE-2017-7669:Apache Hadoop远程权限提升漏洞
  5. 学习python: 常见面试题总结
  6. 大数据技术在电子政务中的应用
  7. 3分钟快速了解,如何一次通过CISSP考试?
  8. 获取微信小程序邀请码并下载
  9. 开机出现 A disk read error occurred Press 时怎么办
  10. 我是住在山里的小和尚,我把我的寺庙生活告诉大家[转载之2]
  11. ubuntu防火墙关闭了为什么扫描端口还是过滤状态
  12. c语言搜题答案软件软件,大学c语音搜题
  13. Android UI 字体库(.ttf文件)的使用 -- xml方式
  14. Python 中 Logging 模块使用详情
  15. Go语言学习笔记—golang基础语法
  16. 电脑PC端下载工具哪个软件好?2023window系统必装的高速下载软件idm下载器
  17. HTML/CSS常见的几种水平居中、垂直居中、水平垂直居中方法
  18. “技术男”升为“管理者”,角色一定要转变,你有好方法吗?
  19. 5.1 上网本安装安卓x86_X86笔记本安装Android 4.0全教程 安卓4.0开发环境搭建
  20. 使用FLEX 和 Actionscript开发FLASH 游戏(一)

热门文章

  1. canvas实现涂鸦效果--橡皮檫和历史记录
  2. 微信短视频加速,张小龙的步子不妨更大一些!
  3. 济宁中考计算机考试试题,济宁市初中信息技术考试模拟题-1.doc
  4. ROS发布/订阅Float64MultiArray数组类消息(C++和Python相互发布和订阅)
  5. ac6005直连ap 如何配置_WLAN1:AC6005组网配置实验
  6. NoSQL 在腾讯应用实践
  7. 学习编程过程中-->遇到的错误
  8. poi 删除 word文档中的图片
  9. 数理统计10.15 | 幂律分布
  10. javascript获取本周、本月、本季度、本年时间