0. 前言

1. 实体完整性

  • 1.1 主键约束(primary key)
  • 1.2 唯一约束(unique)
  • 1.3 自动增长列(auto_increment)

2. 域完整性

  • 数据类型
  • 非空约束
  • 默认值约束

3. 引用完整性

4. 表间的映射关系

0. 前言

什么是数据完整性:保证用户输入的数据能正确地保存到数据库中。

如何确保数据完整性:在创建表时给表中添加约束

完整性的分类:

  1. 实体完整性
  2. 完整性
  3. 引用完整性

1. 实体完整性

什么是实体:表中的一行(一条记录)代表一个实体(entity)。

实体完整性的作用:标识每一行数据不重复。

约束类型:

  1. 主键约束(primary key)
  2. 唯一约束(unique)
  3. 自动增长列(auto_increment)

每个表可以有多个 UNIQUE 约束,但只能有一个 PRIMARY KEY 约束

1.1 主键约束(primary key)

特点:数据唯一,且不能为 null。

-- 第一种添加方式
CREATE TABLE student_1(
     id int primary key,
     name varchar(50)
); -- 第二种添加方式:此种方式优势在于可以创建联合主键
CREATE TABLE student_2_1(
     id int,
     name varchar(50),
     primary key(id)
); CREATE TABLE student_2_2(
     classid int,
     stuid int,
     name varchar(50),
     primary key(classid,stuid)
); -- 第三种添加方式
CREATE TABLE student_3(
     id int,
     name varchar(50)
);
ALTER TABLE student ADD PRIMARY KEY (id);

1.2 唯一约束(unique)

特点:数据不能重复。

CREATE TABLE student(
     id int primary key,
     name varchar(50) unique
);

1.3 自动增长列(auto_increment)

-- 给主键添加自动增长的数值,列只能是整数类型,且必须配合主键使用
CREATE TABLE student(
     Id int primary key auto_increment,
     Name varchar(50)
); INSERT INTO student(name) values('tom');

2. 域完整性

域代表当前单元格。

域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较。

域完整性的约束分类:

  1. 数据类型
  2. 非空约束(not null)
  3. 默认值约束(default)
  4. check 约束(mysql 不支持):check(sex='男' or sex='女')

数据类型

《MySQL 基础、安装、配置》

非空约束(not null)

CREATE TABLE student(
     Id int pirmary key,
     Name varchar(50) not null,
     Sex varchar(10)
); INSERT INTO student values(1, 'tom', null);

默认值约束(default)

CREATE TABLE student(
     Id int pirmary key,
     Name varchar(50) not null,
     Sex varchar(10) default '男'
); insert into student1 values(1, 'tom', '女');
insert into student1 values(2, 'jerry', default);
insert into student1 values(3, 'peter');

3. 引用完整性(外键约束)

在设置外键(FOREIGN KEY)约束的情况下,插入表 2 的外键字段值必需要求在表 1 的主键字段值中能找到。

同时,假设要删除表 1 的某个主键字段值,那么必须保证表 2 中的外键字段没有该主键字段的值,否则就没法删除。

-- 创建表1
CREATE TABLE student(
     sid int pirmary key,
     name varchar(50) not null,
     sex varchar(10) default '男'
); -- 创建表2
-- 第一种添加外键方式
create table score(
  id int,
  score int,
  sid int , -- 外键列的数据类型一定要与主表主键的类型一致
  CONSTRAINT fk_score_sid foreign key (sid) references student(id)
); -- 第二种添加外键方式
ALTER TABLE score ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);

4. 表间的映射关系

示例:

一对一

例如 t_person 表和 t_card 表,即人和身份证。这种情况需要找出主从关系,即谁是主表,谁是从表。人可以没有身份证,但身份证必须要有人才行,所以 t_person 是主表,而 t_card 是从表。

设计从表可以有两种方案:

  • 在 t_card 表中添加外键列(相对 t_person 表),并且给外键添加唯一约束;
  • 给 t_card 表的主键添加外键约束(相对 t_person 表),即 t_card 表的主键也是外键。

一对多(多对一)

最为常见的就是一对多。一对多和多对一,取决于哪个角度去看的,一般都是在多方的那张表创建外键。

多对多

例如 t_stu 和 t_teacher 表,即一个学生可以有多个老师,而一个老师也可以有多个学生。这种情况通常需要创建中间表来处理多对多关系,例如可以再创建一张表 t_stu_tea 表,给出两个外键,一个是相对 t_stu 表的外键,另一个是相对 t_teacher 表的外键。

MSQL 数据完整性(约束)的更多相关文章

  1. enmo_day_06

    RAC Data Guard (DG) EMC NAS SAN 双活 数据完整性 约束 : 主键 : 非空 且 唯一 非空 : 唯一 : 外键 : 检查 : DISABLE, ENABLE VALID ...

  2. oracle学习笔记(转)

    命令行操作:打开服务: services.msc启动Oracle: net start OracleOraHome92TNSListener     net start OracleService实例 ...

  3. MySQL技术内幕读书笔记(四)——表

    目录 表 索引组织表 InnoDB逻辑存储结构 INNODB行记录格式 INNODB数据页结构 约束 视图 分区表 表 ​ 表就是关于特定实体的数据集合,是关系型数据库模型的核心. 索引组织表 ​ 在 ...

  4. SQL Server 2005 中的分区表和索引

    SQL Server 2005 中的分区表和索引 SQL Server 2005          69(共 83)对本文的评价是有帮助 - 评价此主题   发布日期 : 3/24/2005 | 更新 ...

  5. SQL Server 数据完整性的实现——约束

    SQL Server数据库采用的是关系数据模型,而关系数据模型本身的优点之一就是模型本身集成了数据完整性.作为模型一部分而实施的数据完整性(例如在创建数据表时的列属性定义)称作为声明式(Declara ...

  6. MySQL数据库:数据完整性及约束的应用

    数据完整性 1.域完整性:---------匹配完整性:非空.缺省 字段/列 2.实体完整性:-------匹配完整性:主键.唯一键 记录/行 3.引用完整性:-------匹配完整性:外键 表与表之 ...

  7. T-SQL :SQL Server 定义数据完整性 6大约束(三)

    1.创建一客户张表 IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL DROP TABLE dbo.Employees; CREATE TABLE dbo. ...

  8. Oracle 数据完整性与约束机制

    为了维护数据库数据的完整性,在创建表时需要定义一些约束,Oracle中的约束类型包括:非空约束.主键约束.唯一约束.外键约束等.在对约束操作前,我们可以通过表名查询它具有的约束信息. 表约束 SELE ...

  9. 【第三章】MySQL数据库的字段约束:数据完整性、主键、外键、非空、默认值、自增、唯一性

    一.表完整性约束 作用:用于保证数据的完整性和一致性==============================================================约束条件  说明PRIM ...

随机推荐

  1. sed高级指令

    N命令 n命令 n命令简单来说就是提前读取下一行,覆盖模型空间前一行,然后执行后续命令.然后再读取新行,对新读取的内容重头执行sed //从test文件中取出偶数行 [root@localhost ~ ...

  2. prometheus+grafana监控mysql最佳实践

    导航 前言 环境准备 安装Docker 安装prometheus 安装mysqld_exporter prometheus采集数据 安装grafana grafana配置数据源 感谢您的阅读,预计阅读 ...

  3. 【Scrapy(三)】Scrapy 中的 logging 模块

    logging模块的使用: 1.在scrapy中使用 2.在普通项目中使用

  4. Windows下Nexus 5的Android 5.0以上版本官方ROM的刷机教程

    博客链接:http://blog.csdn.net/qq1084283172/article/details/52334452 折腾Android逆向的时候,经常需要给Nexus 5刷机.最近给Nex ...

  5. Windows核心编程 第十九章 DLL基础

    第1 9章 D L L基础 这章是介绍基本dll,我就记录一些简单应用,dll的坑点以及扩展后面两章会说,到时候在总结. 自从M i c r o s o f t公司推出第一个版本的Wi n d o w ...

  6. C++基于文件流和armadillo读取mnist

    发现网上大把都是用python读取mnist的,用C++大都是用opencv读取的,但我不怎么用opencv,因此自己摸索了个使用文件流读取mnist的方法,armadillo仅作为储存矩阵的一种方式 ...

  7. 【技巧】使用xshell和xftp连接centos连接配置

    说明:xshell用来执行指令,xftp用来上传和下载文件. ① 这是xshell连接属性: ②.这是xftp连接属性 附件:这里给个xshelll和xftp的免安装的破解版本地址.侵删. 度娘链接: ...

  8. 使用constexpr时遇到的小坑

    最近在使用constexpr的时候无意中踩了个小坑. 下面给个小示例: #include <iostream> constexpr int n = 10; constexpr char * ...

  9. 一文弄懂pytorch搭建网络流程+多分类评价指标

    讲在前面,本来想通过一个简单的多层感知机实验一下不同的优化方法的,结果写着写着就先研究起评价指标来了,之前也写过一篇:https://www.cnblogs.com/xiximayou/p/13700 ...

  10. [DB] Memcache

    什么是Memcache Redis的前身 严格来说只能叫缓存,不支持持久化,停电后数据丢失 Strom.Spark Streaming实时计算的结果一般会保存在Redis中 JDBC是性能瓶颈 关系型 ...