当前位置:首页 > 文章列表 > 数据库 > MySQL > MySQL学习之完整性约束详解

MySQL学习之完整性约束详解

来源:脚本之家 2023-01-07 12:08:32 0浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《MySQL学习之完整性约束详解》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

数据完整性指的是数据的一致性和正确性。完整性约束是指数据库的内容必须随时遵守的规则。若定义了数据完整性约束,MySQL会负责数据的完整性,每次更新数据时,MySQL都会测试新的数据内容是否符合相关的完整性约束条件,只有符合完整性的约束条件的更新才被接受。

1、主键约束

主键就是表中的一列或多个列的组合,其值能唯一地标识表中的每一行。MySQL为主键列创建唯一性索引,实现数据的唯一性。在查询中使用主键时,该索引可用来对数据进行快速访问。通过定义PRIMARY KEY约束来创建主键,而且PRIMARY KEY约束中的列不能取空值。如果PRIMARY KEY约束是由多列组合定义的,则某一列的值可以重复,但PRIMARY KEY约束定义中所有列的组合值必须是唯一的。

可以使用两种方式定义主键来作为列或表的完整性约束。作为列的完整性约束时,只需在列定义的时候加上关键字PRIMARY KEY。作为表的完整性约束时,需要在语句最后加上一条PRIMARY KEY(col_name,...)语句。

例:创建表book_copy,将书名定义为主键

CREATE TABLE book_copy
(图书编号 varchar(6) NULL,
书名 varchar(20) NOT NULL PRIMARY KEY,
出版日期 date
);

当表中的主键为复合主键时,只能定义为表的完整性约束。

创建course表来记录每门课程的学生学号、姓名、课程号和学分。其中学号、课程号构成复合主键

CREATE TABLE course
(学号 varchar(6) NOT NULL,
姓名 varchar(8) NOT NULL,
课程号 varchar(3),
学分 tinyint,
PRIMARY KEY(学号,课程名)
);

原则上,任何列或者列的组合都可以充当一个主键。但是主键列必须遵守一些规则:

1、每个表只能定义一个主键。关系模型理论要求必须为每个表定义一个主键。然而,MySQL并不要求这样,即可以创建一个没有主键的表。但是,从安全角度应该为每个基本表指定一个主键。主要原因在于,没有主键,可能在一个表中存储两个相同的行。当两个行不能彼此区分时,在查询过程中,它们将会满足同样的条件,更新的时候也总是一起更新,容易造成数据库奔溃。

2、表中两个不同的行在主键上不能具有相同的值,这就是唯一性规则。

3、如果从一个复合主键中删除一列后,剩下的列构成主键仍然满足唯一性原则,那么,该复合主键是不正确的,这条规则称为最小化规则。也就是说,复合主键不应该包含不必要的列。

4、一个列名在一个主键的列表中只能出现一次。

MySQL自动地为主键创建一个索引。通常,这个索引名为PRIIMARY。不过,也可以重新给改索引另起名。

例:创建course表来记录每门课程的学生学号、姓名、课程号和学分。其中学号、课程号构成复合主键,将主键创建的索引命名为INDEX_C

CREATE TABLE course
(学号 varchar(6) NOT NULL,
姓名 varchar(8) NOT NULL,
课程号 varchar(3),
学分 tinyint,
PRIMARY KEY INDEX_C(学号,课程名)
);

2、替代键约束

替代键像主键一样,是表的一列或一组列,他们的值在任何时候都是唯一的。替代键是没有被选做主键的候选键。定义替代键的关键字是UNIQUE

例:在表book中将图书编号作为主键,书名列定义为一个替代键。 

CREATE TABLE book
(
图书编号 varchar(20) NOT NULL,
书名 varchar(20) NOT NULL UNIQUE,
PRIMARY KEY(图书编号)
); 

在MySQL中替代键和主键的区别主要有以下几点:

1、一个数据表只能创建一个主键。但一个表可以有若干个UNIQUE键,并且他们甚至可以重合,例如,在C1和C2列上定义了一个替代键,并且在C2和C3列上定义了另一个替代键,这两个替代键在C2列上重合了,这是MySQL允许的。

2、主键字段的值不允许为NULL,而UNIQUE 字段的值可以是NULL,但必须使用NULL或NOT NULL声明。

3、创建PRIMARY KEY约束时,系统自动产生PRIMARY KEY索引。创建UNIQUE约束时,系统自动产生UNIQUE索引。

3、参照完整性约束

只有图书目录表中有的图书才可以销售,因此,在Sell表中的所有图书必须是Book表有的图书,也就是说存储在Sell表中的所有图书编号必须存在于Book表的图书编号列中。同样Sell表中的所有身份证号也必须出现在Members表的身份证号列中。这种类型的关系就是参照完整性约束。参照完整性约束都是一种特殊的完整性约束,实现为一个外键。所以Sell表中的图书编号列和身份证号列都可以定义为一个外键。可以在创建表或修改表时定义一个外键声明

定义外键的语法格式:REFERENCES 表名 [ ( 列名 | (长度)] [ ASC | DESC ],...) ]

[ON DELETE { RESTRICT | CASCADE | SET NULL | NO ACTION } ]

[ON UPDATE { RESTRICT | CASCADE | SET NULL | NO ACTION } ]

外键被定义为表的完整性约束,语法中包含了外键所参照的表和列,还可以声明参照动作。如果没有指定动作,两个参照动作就会默认地使用RESTRICT。

MySQL参照完整性约束目前只可以用在那些使用InnoDB存储引擎创建的表中,对于其他类型的表,MySQL服务器能够解析CREATE TABLE语句中的FOREIGN KEY语法,但不能使用或保存它。

要修改表的存储引擎,可以采用ALTER TABLE语句。例如,修改Book表的存储引擎为InnoDB,使用:ALTER TABLE book ENGINE=INNODB;

例:创建book_ref表,所有的book_ref表中图书编号都必须出现在Book表中,假设已经使用图书编号列作为Book表主键。

CREATE TABLE book_ref
(
图书编号 varchar(20) null,
书名 varchar(20) null,
出版日期 date null,
PRIMARY KEY(书名),
FOREIGN KEY(图书编号)
REFERENCES Book(图书编号)
ON DELETE RESTRICT
ON UPDATE RESTRICT
)ENGINE=INNODB;

当指定一个外键时,适用以下规则:

1、被参照表必须已经用1条CREATE TABLE语句创建了,或者必须是当前正在创建的表。在后一种情况下,参照表是同一个表。

2、必须为被参照表定义主键

3、必须在被参照表的表名后面指定列名(或列名的组合)。该列(或该列组合)必须是这个表的主键或替代键。

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

5、外键中列的数目必须和被参照表的主键列的数目相同

6、外中列的数据类型必须和被参照表的主键中列的数据类型相同

例:创建带有参照动作CASCADE的book_refl表 

CREATE TABLE book_refl
(
图书编号 varchar(20) null,
书名 varchar(20) not null,
出版日期 date null,
PRIMARY KEY(书名),
FOREIGN KEY(图书编号)
REFERENCES Book(图书编号)
ON UPDATE CASCADE
)ENGINE=INNODB;

4、CHECK完整性约束

主键、替代键和外键都是常见的完整性约束的例子。但是,每个数据库都还有一些专用的完整性约束。例如,Sell表中订购册数要在1~5000之间,Book表中出版时间必须大于1986年1月1日。这样的规则可以使用CHECK完整性约束来指定。

CHECK完整性约束在创建表的时候定义。可以定义为列完整性约束,也可以定义为表完整性约束。

语法格式:CHECK(表达式)

例:创建表student,只考虑学号和性别两列,性别只能包含男或女 

CREATE TABLE student
(
学号 char(6) not null,
性别 char(2) not null,
CHECK(性别 IN('男','女'))
);

例:创建表student,只考虑学号和出生日期两列,出生日期必须大于1980年1月1日

CREATE TABLE student
(
学号 char(6) not null,
出生日期 date not null
CHECK(出生日期>'1980-01-01')
);

本篇关于《MySQL学习之完整性约束详解》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于数据库的相关知识,请关注golang学习网公众号!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
sql跨表查询的三种方案总结sql跨表查询的三种方案总结
上一篇
sql跨表查询的三种方案总结
Mysql主从三种复制模式(异步复制,半同步复制,组复制)
下一篇
Mysql主从三种复制模式(异步复制,半同步复制,组复制)
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 茅茅虫AIGC检测:精准识别AI生成内容,保障学术诚信
    茅茅虫AIGC检测
    茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
    19次使用
  • 赛林匹克平台:科技赛事聚合,赋能AI、算力、量子计算创新
    赛林匹克平台(Challympics)
    探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
    50次使用
  • SEO  笔格AIPPT:AI智能PPT制作,免费生成,高效演示
    笔格AIPPT
    SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
    58次使用
  • 稿定PPT:在线AI演示设计,高效PPT制作工具
    稿定PPT
    告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
    53次使用
  • Suno苏诺中文版:AI音乐创作平台,人人都是音乐家
    Suno苏诺中文版
    探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
    57次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码