我们知道,一种数据模型必须包含三个基本的部分:

  • 构造机制(数据结构):主要描述数据的类型、内容、性质以及数据间的联系等。
  • 运算机制(数据操作):主要描述在相应的数据结构上的操作类型和操作方式。
  • 约束机制(数据约束):主要描述数据结构内数据间的语法、词义联系、他们之间的制约和依存关系,以及数据动态变化的规则,以保证数据的正确、有效和相容。

作为数据库的一种数据模型,关系模型提供了一组完整性规则或限制。完整性约束用于确定关系数据库里数据的准确性和一致性。

在关系型数据库里,完整性约束包括域完整性实体完整性引用完整性以及用户定义完整性

一、完整性约束的概念

1.1 域完整性

域完整性,是指给定列的取值范围(即输入的有效性),比如性别取值应为男或女。

强制域有效性的方法有:限制类型(通过数据类型)、格式(通过 CHECK 约束和规则)或可能值的范围(通过 FOREIGN KEY 约束、CHECK 约束、DEFAULT 定义、NOT NULL 定义和规则)。

1.2 实体完整性

实体完整性,是指使用主键来唯一地标识一个实体。

在关系数据库中,一条记录代表一个实体。而实体是可以相互区分、识别的,也即它们应具有某种唯一性标识(该标识不能取相同的值,也不能为空)。

实体完整性强制表的标识符列或主键的完整性(通过索引、UNIQUE 约束、PRIMARY KEY 约束或 IDENTITY 属性)。

1.3 引用完整性

引用完整性,就是定义外键与主键之间的引用规则。

假设有两个关系:

Student (stuID, name, sex, age, classID);
Class (classID, amount, teacherName);

其中 classID 是关系 Student 的外键,它引用了关系 Class 里的 classID。这个外键确保了关系 Student 里的每个 classID 都在关系 Class 中有对应的 classID。在输入或删除记录时,引用完整性保持表之间已定义的关系:

  • 为了在 Student 中插入一条记录,其 classID 首先要存在于 Class 中。
  • 在 Class 中删除一条记录,则 Student 中 classID 值对应的记录必须全部被删除。

引用完整性基于外键与主键之间或外键与唯一键之间的关系(通过 FOREIGN KEY 和 CHECK 约束)。引用完整性确保键值在所有表中一致。这样的一致性要求不能引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。

1.4 用户定义完整性

用户定义完整性让用户可以定义不属于其它任何完整性分类的特定业务规则。所有的完整性类型都支持用户定义完整性(CREATE TABLE 中的所有列级和表级约束、存储过程和触发器)。

二、MySQL中的约束

不同的数据库产品对完整性约束的支持程度不一样,但基本的完整性约束都是支持的。相信以后会越来越完善。

2.1 主键约束

主键,又称主码,是表中一列或多列的组合,能够唯一地标识表中的一条记录。主键约束(Primary Key Constraint)要求主键列的数据唯一,且不允许为空。

在创建表的过程中添加一个字段的主键约束:

CREATE TABLE employees (
id INT(11) AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
deptId INT(3) NOT NULL,
salary FLOAT NOT NULL
);
CREATE TABLE employees (
id INT(11) AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
deptId INT(3) NOT NULL,
salary FLOAT NOT NULL,
PRIMARY KEY(id)
);

注意:AUTO_INCREMENT表示自增,默认初始值为1。

也可以使用多个字段的组合作为主键:

CREATE TABLE employees (
name VARCHAR(20) NOT NULL,
deptId INT(3) NOT NULL,
salary FLOAT NOT NULL,
PRIMARY KEY(name, deptId)
);

另外,也可以在建表之后使用ALTER添加主键约束:

CREATE TABLE employees (
name VARCHAR(20) NOT NULL,
deptId INT(3) NOT NULL,
salary FLOAT NOT NULL,
); ALTER TABLE employees ADD CONSTRAINT emp_pk PRIMARY KEY(name, deptId);

2.2 唯一性约束

唯一性约束(Unique Constraint)要求表里某个字段的值在每条记录里都是唯一的,这一点与主键类似。声明为 UNIQUE 的字段允许为空,但只能出现一个空值。

CREATE TABLE department(
deptId INT(3) PRIMARY KEY,
name VARCHAR(20) UNIQUE,
location VARCHAR(50)
);
CREATE TABLE department(
deptId INT(3) PRIMARY KEY,
name VARCHAR(20),
location VARCHAR(50),
UNIQUE(name)
);

2.3 外键约束

外键(Foreign Key):首先它是表中的一个字段,它可以不是本表的主键,但必须对应另外一个表的主键。外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。

外键约束是确保表与表之间引用完整性的主要机制。一个表可以有一个或多个外键。通常,我们把外键所在的表称为子表,外键所引用的表称为父表

CREATE TABLE employees(
id INT(11) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
deptId INT(3) NOT NULL,
salary FLOAT NOT NULL,
CONSTRAINT emp_fk FOREIGN KEY(deptId) REFERENCES department(deptId)
);

或者

ALTER TABLE employees ADD CONSTRAINT emp_fk FOREIGN KEY(deptId) REFERENCES department(deptId);

2.4 非空约束

非空约束(Not Null Constraint)指字段的值不能为空。对于使用了 NOT NULL 约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。

CREATE TABLE employees (
id INT(11) PRIMARY KEY,
name VARCHAR(20),
deptId INT(3),
salary FLOAT
);

添加非空约束:

ALTER TABLE employees MODIFY name varchar(20) NOT NULL;

取消非空,并添加默认值:

ALTER TABLE employees MODIFY name varchar(20) DEFAULT 'abc';

2.5 检查约束

检查约束(Check Constraint)用于检查输入到特定字段的数据的有效性。MySQL不支持check约束,但可以使用check约束,而没有任何效果。

CREATE TABLE employees (
id INT(11) PRIMARY KEY,
name VARCHAR(20),
age INT(3),
CONSTRAINT age_chk CHECK(age>18)
);

上面 check 约束要求 age 必须大于18,但插入数据时却没有起到任何作用。

MySQL基础笔记(二) 完整性约束的更多相关文章

  1. MYSQL基础笔记(二)-SQL基本操作

    SQL基本操作 基本操作:CRUD,增删改查 将SQL的基本操作根据操作对象进行分类: 1.库操作 2.表操作 3.数据操作 库操作: 对数据库的增删改查 新增数据库: 基本语法: Create da ...

  2. MYSQL基础笔记(一)

    关系型数据库概念: 1.什么是关系型数据库? 关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 关系模型包含三个方面: 1.数据结构:数据存储的问题,二 ...

  3. MYSQL基础笔记(六)- 数据类型一

    数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...

  4. MYSQL基础笔记(四)-数据基本操作

    数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...

  5. MYSQL基础笔记(三)-表操作基础

    数据表的操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段n 数据类型 --最后一行不需要加逗号 ...

  6. Mysql基础(三):MySQL基础数据类型、完整性约束、sql_mode模式

    目录 2.MySQL基础数据类型.完整性约束.sql_mode模式 1. MySQL常用数据类型 2. 完整性约束 3. MySQL的sql_mode模式说明以及设置 2.MySQL基础数据类型.完整 ...

  7. 数据库02 /MySQL基础数据类型、完整性约束、sql_mode模式

    2.MySQL基础数据类型.完整性约束.sql_mode模式 目录 2.MySQL基础数据类型.完整性约束.sql_mode模式 1. MySQL常用数据类型 MySQL常用数据类型预览 1. 1 数 ...

  8. MySQL基础(二)——DDL语句

    MySQL基础(二)--DDL语句 1.什么是DDL语句,以及DDL语句的作用 DDL语句时操作数据库对象的语句,这些操作包括create.drop.alter(创建.删除.修改)数据库对象. 2.基 ...

  9. MYSQL基础笔记(五)- 练习作业:站点统计练习

    作业:站点统计 1.将用户的访问信息记录到文件中,独占一行,记录IP地址 <?php //站点统计 header('Content-type:text/html;charset=utf-8'); ...

  10. JavaScript基础笔记二

    一.函数返回值1.什么是函数返回值    函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...

随机推荐

  1. python+selenium自动化登录dnf11周年活动界面领取奖励登录部分采坑总结[1]

    背景: Dnf的周年庆活动之一,游戏在6月22日 06:00~6月23日 06:00之间登陆过游戏后可以于6月25日 16:00~7月04日 06:00领取奖励 目标:连续四天自动运行脚本,自动领取所 ...

  2. 微信小程序入口场景的问题整理与相关解决方案

    前言 最近一段时间都在做小程序. 虽然是第二次开发小程序,但是上次做小程序已经是一年前的事了,所以最终还是被坑得死去活来. 这次是从零开始开发一个小程序,其实除了一些莫名其妙的兼容性问题,大多数坑点都 ...

  3. excel数据比对,查找差异

    1.选中需比对的数据 2.开始->条件格式->突出显示单元格规则->重复值 3.选择唯一值,点击确定 4.结果展示 5.颜色标识的即:不同值

  4. Django reverse函数

    1.总urls.py内容如下: from django.contrib import admin from django.urls import path from django.conf.urls ...

  5. Spider-天眼查字体反爬

    字体反爬也就是自定义字体反爬,通过调用自定义的woff文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容! 1.思路 近期在爬取天 ...

  6. CentOS 6.5 x64 安装Tomcat8 并配置两个Tomcat8

    1.首先,安装tomcat的前提是已经配置好jdk环境变量,若没配好可以参考我的上一篇博文:CentOS 6.5 x64安装jdk8,当然也可以通过网络搜索安装步骤~~ 2.下载: 可以通过官网下载: ...

  7. 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务

    Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback:如果发生的异常是checked异常,默认情况下数据库操作还是会 ...

  8. ServletContext作用功能详解

    ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而servletContext,所 ...

  9. LibreOJ2302 - 「NOI2017」整数

    Portal Description 有一个整数\(x=0\),对其进行\(n(n\leq10^6)\)次操作: 给出\(a(|a|\leq10^9),b(b\leq30n)\),将\(x\)加上\( ...

  10. bzoj3142[Hnoi2013]数列 组合

    Description 小 T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察 到:除第一天外每天的股价都 ...