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学习之完整性约束详解的文章就介绍到这了,更多相关MySQL完整性约束内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL学习笔记4:完整性约束限制字段

    完整性约束是对字段进行限制,从而符合该字段达到我们期望的效果比如字段含有默认值,不能是NULL等 直观点说:如果插入的数据不满足限制要求,数据库管理系统就拒绝执行操作 设置表的主键 主键能够标识表中每条信息的唯一性,如同身份证号码和人的关系 人可以同名,但是身份证号码却是唯一的, 创建主键的目的在于快速查找到表中的某一条信息 单字段主键 复制代码 代码如下: mysql> create table student( -> id int primary key, -> name varch

  • 基于MySQL数据库的数据约束实例及五种完整性约束介绍

    为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确.有效.相容. #数据约束 #五种完整性约束: #NOT NULL :非空约束,指定某列不能为空: #UNIQUE : 唯一约束,指定某列或者几列组合不能重复 #PRIMARY KEY :主键,指定该列的值可以唯一地标识该列记录 #FOREIGN KEY :外键,指定该行记录从属于主表中的一条记录,主要用于参照完

  • MySQL完整性约束的定义与实例教程

    完整性约束 完整性约束的定义 为了保证插入数据的正确性和合法性,给表中字段添加,除了 数据类型约束 以外的 其他约束条件 . 完整性约束的分类 实体完整性:记录之间不能重复. 主键约束(primary key) :唯一并且不能为空 唯一约束(unique) :唯一可以为空 主键自增(auto_increment) 域完整性:数据库表的字段,必须符合某种特定的数据类型或约束. 类型约束 :在创建表的时候,已经给每个字段添加类型了 非空约束 :not null 默认值 :default 引用完整性(

  • mysql完整性约束实例详解

    本文实例讲述了mysql完整性约束.分享给大家供大家参考,具体如下: 主要内容 not null 与 default unique primary auto_increment foreign key 约束条件作用:用于保证数据的完整性和一致性 主要分为 PRIMARY KEY (PK)    #标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK)    #标识该字段为该表的外键 NOT NULL    #标识该字段不能为空 UNIQUE KEY (UK)    #标识该

  • MySQL学习之完整性约束详解

    数据完整性指的是数据的一致性和正确性.完整性约束是指数据库的内容必须随时遵守的规则.若定义了数据完整性约束,MySQL会负责数据的完整性,每次更新数据时,MySQL都会测试新的数据内容是否符合相关的完整性约束条件,只有符合完整性的约束条件的更新才被接受. 1.主键约束 主键就是表中的一列或多个列的组合,其值能唯一地标识表中的每一行.MySQL为主键列创建唯一性索引,实现数据的唯一性.在查询中使用主键时,该索引可用来对数据进行快速访问.通过定义PRIMARY KEY约束来创建主键,而且PRIMAR

  • 在 CentOS 7 中安装 MySQL 8 的教程详解

    准备 本文环境信息: 软件 版本 CentOS CentOS 7.4 MySQL 8.0.x 安装前先更新系统所有包 sudo yum update 安装 1. 添加 Yum 包 wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm # 或者 wget http://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm sudo yum up

  • Java Spring5学习之JdbcTemplate详解

    一.JdbcTemplate Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作 二.实战 2.1 引入依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.24</version> </dependency> <!-

  • MySQL sql_mode的使用详解

    前言 相信看过上一篇文章<MySQL案例:一个数据丢失惨案>的童鞋,都应该意识到,sql_mode是一个非常关键的配置,接下来就带来该配置项的详细解析. sql_mode详解 sql_mode,会直接影响SQL语法支持和数据校验,它包含非常多的选项,其中5.7版本的默认值是 "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,:ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_C

  • MySQL DEFINER具体使用详解

    目录 前言: 1.DEFINER简单介绍 2.一些注意事项 总结: 前言: 在 MySQL 数据库中,在创建视图及函数的时候,你有注意过 definer 选项吗?在迁移视图或函数后是否有过报错情况,这些其实都可能和 definer 有关系.本篇文章主要介绍下 MySQL 中 definer 的含义及作用. 1.DEFINER简单介绍 以视图为例,我们来看下官方给出的视图创建基础语法: CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TE

  • MySql数据类型教程示例详解

    目录 1.简要概述 2. MySQL数据类型详解 1) 字符串类型 2) 整数类型 3)浮点数类型 4)日期/时间类型 1.简要概述 为什么要开通MySQL这个学习板块呢?因为这是一名数据分析师必要的一项技能.分析数据什么最重要?当然是数据,既然如此!在数据呈现爆发式增长的年代,怎么能够不学学数据库呢?其实这也是很多读者朋友希望看到的,也是他们建议我写的. 难者不会,会者不难!其实网上很多MySQL的总结文章,不可否认,知识点写的都很全,但是呢!这个只是会使用MySQL数据库的朋友的一个查询手册

  • 非常实用的MySQL函数全面总结详解示例分析教程

    目录 1.MySQL中关于函数的说明 2.单行函数分类 3.字符函数 4.数学函数 5.日期时间函数 6.其它常用系统函数 7.流程控制函数 8.聚合函数 1)聚合函数的功能和分类: 2)聚合函数的简单使用 3)五个聚合函数中传入的参数,所支持的数据类型有哪些? 4)聚合函数和group by的使用"最重要": 1.MySQL中关于函数的说明 "概念":类似java.python中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名: "好处":

  • MySQL架构设计思想详解

    目录 前言 1. MySQL整体架构 2. 连接器 3. 查询缓存 4. 分析器 5. 优化器 6. 执行器 7. 总结 前言 很多开发同学对SQL优化如数家珍,却对MySQL架构一知半解.岂不是只见树叶,不见森林,终将陷入细节中不能自拔. 今天就一块学习MySQL分层架构,深入了解MySQL底层实现原理,以及每层的作用,我们常见的SQL优化到底在哪一层做了优化? 1. MySQL整体架构 由图中可以看到MySQL架构主要分为Server层和存储引擎层. Server层又分为连接器.缓存.分析器

  • mysql 数据备份与恢复使用详解(超完整详细教程)

    目录 一.前言 二.数据备份策略 1.全备 2.增备 3.差异备份 三.数据备份类型 1.冷备 2.热备 3.温备 四.前置准备 五.mysqldump 数据备份命令使用 1.命令格式 2.案例演示 3.其他重要参数选项补充 六.mysqldump 数据恢复 1.全量恢复 2.全量备份中恢复单库 3.从某个数据库中恢复单表数据 4.使用dump + binlog进行数据恢复 七.物理备份 八.表的导出与导入 1. 使用SELECT…INTO OUTFILE导出文本文件 2. 使用mysqldum

  • Mysql中explain作用详解

    一.MYSQL的索引 索引(Index):帮助Mysql高效获取数据的一种数据结构.用于提高查找效率,可以比作字典.可以简单理解为排好序的快速查找的数据结构. 索引的作用:便于查询和排序(所以添加索引会影响where 语句与 order by 排序语句). 在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据.这样就可以在这些数据结构上实现高级查找算法.这些数据结构就是索引. 索引本身也很大,不可能全部存储在内存中,所以索引往往以索引文件的形式存储在磁盘上. 我们

随机推荐