文章目录

  • 1 数据的完整性作用
  • 2 完整性的分类
    • 2.1 实体完整性
      • 2.1.1 主键约束 primary key
      • 2.1.2 唯一约束 unique
      • 2.1.3 自动增长列 auto_increment
    • 2.2 域完整性
      • 2.2.1 非空约束 not null
      • 2.2.2 默认值约束 default
      • 2.2.3 检查约束 CHECK 8.0.15之前版本不支持
    • 2.3 引用完整性(参照完整性)
      • 2.3.1 关系分类:
      • 2.3.2 一对一
      • 2.3.3 一对多
      • 2.3.4 多对多
  • 3 小结

1 数据的完整性作用

  • 保证保存到数据库中的数据是正确的
  • 它可以防止可能的输入错误
  • 确保数据的完整性 = 在建表的时候给表添加约束

2 完整性的分类

实体完整性 域完整性 引用完整性

2.1 实体完整性

  • 实体:表中的一行数据代表一个实体
  • 实体完整性的作用:保证每一行数据不重复

通过实体完整性约束来实现

  • 实体完整性的约束类型:
    主键约束 primary key 数据唯一,而且不能为空
    唯一约束 unique 数据唯一
    自动增长列 auto_increment

2.1.1 主键约束 primary key

  • 特点:数据唯一,而且不能为空
  • 添加方式一:
CREATE TABLE stu(id INT PRIMARY KEY,NAME VARCHAR(10)
);
INSERT INTO stu VALUES(2,'aaa');
SELECT * FROM stu;
  • 添加方式二:可以建立联合主键
CREATE TABLE stu2(id INT,NAME VARCHAR(10),PRIMARY KEY(id)
);
INSERT INTO stu2 VALUES(1,'aaa');
SELECT * FROM stu2;CREATE TABLE stu3(id INT,NAME VARCHAR(10),classid INT,PRIMARY KEY(id,classid)
);
INSERT INTO stu3 VALUES(2,'aaa',1);
SELECT * FROM stu3;
  • 添加方式三:
CREATE TABLE stu4(id INT,NAME VARCHAR(10)
);
ALTER TABLE stu4 ADD CONSTRAINT PRIMARY KEY(id);
-- 可以省略CONSTRAINT
ALTER TABLE stu4 ADD PRIMARY KEY(id);
-- 起键名
ALTER TABLE stu4 ADD CONSTRAINT pk_stu4_id PRIMARY KEY(id);
  • 删除主键:
ALTER TABLE stu4 DROP PRIMARY KEY;

2.1.2 唯一约束 unique

  • 特点:数据唯一
  • 添加方式
CREATE TABLE stu5(id INT PRIMARY KEY,NAME VARCHAR(10) UNIQUE
);
INSERT INTO stu5 VALUES(4,NULL);
SELECT * FROM stu5;

2.1.3 自动增长列 auto_increment

  • 给主键列添加的一个自动增长的数值,列只能是整数类型
  • 如果删除之前自动增长的数值,后面再次添加的时候不会再次出现被删除的值,而是接着被删除之后的值开始
CREATE TABLE stu6(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(10)
);INSERT INTO stu6(NAME) VALUES ('aaa');
SELECT * FROM stu6;
INSERT INTO stu6 VALUE(NULL,'bbb');
INSERT INTO stu6 VALUE(20,'ccc');DELETE FROM stu6 WHERE id=22;

2.2 域完整性

  • 表示表中的列(字段)必须符合某种特点的数据类型或者约束类型。
  • 域:表示列(表示单元格)
  • 作用:保证此列下的每一个单元格的数据是正确的。但是不对照此列的其他单元格进行比较
  • 域完整的约束:
    数据类型 :数值,日期,字符串。。。
    非空约束 not null
    默认值约束 default
    检查约束 CHECK

2.2.1 非空约束 not null

CREATE TABLE stu7(id INT PRIMARY KEY,NAME VARCHAR(10) NOT NULL
);
INSERT INTO stu7 VALUES(2,'aaa');
SELECT * FROM stu7;

2.2.2 默认值约束 default

CREATE TABLE stu8(id INT PRIMARY KEY,NAME VARCHAR(10) NOT NULL,gender VARCHAR(10) DEFAULT '男'
);
INSERT INTO stu8(id,NAME) VALUES(2,'aaa');
SELECT * FROM stu8;
INSERT INTO stu8 VALUES(3,'aaa','女');
INSERT INTO stu8 VALUES(4,'aaa',NULL);
INSERT INTO stu8 VALUES(5,'aaa',DEFAULT);

2.2.3 检查约束 CHECK 8.0.15之前版本不支持

CREATE TABLE stu9(id INT PRIMARY KEY,NAME VARCHAR(10) NOT NULL,gender VARCHAR(10) CHECK(gender='男' OR gender='女')
);INSERT INTO stu9 VALUES(1,'aaa','人妖');
SELECT * FROM stu9;
DELETE FROM stu9 WHERE id=1;

2.3 引用完整性(参照完整性)

  • 引用完整性描述的是表和表之间的关系

  • 外键约束 foreign key

  • 注意事项:
    要有外键,必须现有主键。
    要在子表种添加外键约束,主表中引用的那一列必须是主键
    主键和外键的类型要一致。
    保证一个表的外键和另一个表的主键对应。

  • 引用完整性究竟是什么?
    指的是子表外键的值引用主表中主键的值
    一旦有了约束,子表中外键的所有值都必须是主表中主键有的值。

2.3.1 关系分类:

  • 一对一:主表中的一条数据对应子表中的一条数据
  • 一对多(多对一):主表中的一条数据对应子表中的多条数据
  • 多对多:主表中的多条数据对应子表中的多条数据

举例说明:
一对一:身份证号 学校的学号 国家的一夫一妻制…
一般一对一就放到一张表中。
如果非要用2张表来表示,怎么办? 人和身份证号
需要先找出主从关系。
人可以没有身份证,但是有身份证就必然对应一个人
所以人是主表person,身份证是子表card。

2.3.2 一对一

如何设计?身份证号 学校的学号 国家的一夫一妻制…
2种方案:

  1. 在card中添加外键,并给外键添加唯一约束
CREATE TABLE person(id INT PRIMARY KEY,NAME VARCHAR(10)
);CREATE TABLE card(cid INT PRIMARY KEY,id INT UNIQUE,CONSTRAINT fk_id FOREIGN KEY(id) REFERENCES person(id)
);

  1. 给card中的主键添加外键约束
CREATE TABLE card2(cid INT PRIMARY KEY,CONSTRAINT fk_cid FOREIGN KEY(cid) REFERENCES person(id)
);

2.3.3 一对多

一对多:dept和emp   一个爸爸有多个孩子   我有多个手机,玩具,电脑。。。至少要用2张表来描述。都是在多方创建外键
  • 第一种添加方式:
CREATE TABLE emp1(id INT PRIMARY KEY,NAME VARCHAR(10) NOT NULL,deptid INT,CONSTRAINT fk_dept_emp1_depid FOREIGN KEY(deptid) REFERENCES dept(deptid));
  • 第二种添加方式:
ALTER TABLE emp ADD CONSTRAINT fk_deptid FOREIGN KEY(deptid) REFERENCES dept(deptid);
  • 删除外键约束:
-- alter table 表名 drop foreign key 外键约束名;
ALTER TABLE emp DROP FOREIGN KEY fk_deptid;

2.3.4 多对多

多对多:老师和学生至少需要3张表,需要创建中间表。在中间表中给出2个列一个引用老师表,一个引用学生表。添加2个外键约束,保证引用关系正确。
CREATE TABLE student(sid INT PRIMARY KEY,sname VARCHAR(10) NOT NULL
);CREATE TABLE teacher(tid INT PRIMARY KEY,tNAME VARCHAR(10) NOT NULL
);CREATE TABLE stu_tea(sid INT,tid INT
);ALTER TABLE stu_tea ADD CONSTRAINT fk_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid);
ALTER TABLE stu_tea ADD CONSTRAINT fk_stu_sid FOREIGN KEY(sid) REFERENCES student(sid);

  • 为什么要拆表?
    为了避免表中出现大量的重复数据

3 小结

  • 实体完整性描述的行
  • 域完整性描述的是列
  • 引用完整性描述的是关系

数据的完整性(正确性和准确性):分类-实体完整性:主键约束、唯一约束、自动增长列。域完整性-非空约束、默认值约束、检查约束。引用完整性-一对一、一对多、多对多相关推荐

  1. 2019-7-26 [MySQL] 安装与介绍 语句分类/语法 数据类型 DDL数据定义:创建/查看/删除/使用 DML数据操作:增删改 主键约束 自动增长列 非空约束 默认值 Navicat

    文章目录 0.知识回顾 1.数据库介绍 1.1 数据库概述 1.1.1 什么是数据库 1.1.2 什么是数据库管理系统 1.1.3 数据库与数据库管理系统的关系 1.2 数据库表 1.3 表数据 1. ...

  2. 在SQL和ERWIN中用自定义类型、规则和默认值实现check约束从而保证数据的完整性...

    ========================================================= /*创建一个名为list的规则,这条规则表明变量只能取0和1两个值*/ CREATE ...

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

    我们都知道在数据库MYSQL当中有三种不同的完整性约束,分别为:实体完整性,参照完整性和用户定义完整性. 直接上干货篇: 通俗的讲:实体完整性是用来约束主键(primary key)和候选键(uniq ...

  4. MySQL→数据库、启动连接数据库、SQL→DDL数据定义语言及数据类型、DML数据操作语言、DQL数据查询语言、数据库约束→主键、唯一、非空、默认、外键、SQL、三大范式及一多关系、视图、内外连接

    MySQL连接退出命令 mysql –uroot -proot mysql –h127.0.0.1 –uroot -proot mysql --host=localhost --user=root - ...

  5. oracle批量插入并且返回自增主键_mybatis + (oracle)实现主键自增 + 插入数据并返回主键...

    一.实现主键自增 在oracle数据库中,主键并没有办法自动增长,无法使用insert对应的useGeneratedKeys和keyProperty属性自动返回增加的主键. 要实现自增需要修改 ID列 ...

  6. SQL Server2000导出数据时包含主键、字段默认值、描述等信息

    时经常用SQL Server2000自带的导出数据向导将数据从一台数据库服务器导出到另一台数据库服务器: 结果数据导出了,但表的主键.字段默认值.描述等信息却未能导出,一直没想出什么方法,今天又尝试了 ...

  7. 数据的完整性(实体完整性、域完整性、引用完整性)

    数据的完整性(实体完整性.域完整性.引用完整性) 1 数据库的完整 2 实体完整性 2.1 主键约束(primary key) 2.2 唯一约束(unique) 2.3 自动增长序列(auto_inc ...

  8. 数据库中的数据完整性(实体完整性、域完整性、引用完整性)

    作用:保证用户输入的数据保存到数据库中是正确的. 确保数据的完整性 = 在创建表时给表中添加约束 完整性的分类: 实体完整性: 域完整性: 引用完整性: 4.1 实体完整性 实体:即表中的一行(一条记 ...

  9. SQL语句(二)创建带主键和约束的数据表

    内容摘要 创建带主键和约束的表 创建带组合主键和外键的表 1. 创建带主键和约束的表 Student (学生表) CREATE TABLE Student ( sclass varchar(10) N ...

最新文章

  1. android运行exe没有反应,安卓最担心的事情发生了
  2. BZOJ 4422 (线段树、DP、扫描线、差分)
  3. C++string容器-字符串查找和替换
  4. php开放源码的时机商计 (CK-ERP) 发布 0.15.1 版
  5. mysql批量更新报错_Mysql批量更新的三种方式
  6. 2016年度太和顾问北京高科技行业人力资本数据信息发布
  7. kubernetes集群搭建(二进制方式)
  8. 过滤器和拦截器的区别_拦截器和过滤器的区别
  9. jsp实验报告(一)
  10. Multisim10的4013BD_5V测试电路
  11. AI嘻哈写歌词软件总结
  12. 当我在荒废时间的时候会有多少人在拼命
  13. 怎么把python压缩_python中如何实现图片压缩
  14. 连续霸榜丨EasyDL到底有多强?
  15. java毕业设计企业人事信息管理mybatis+源码+调试部署+系统+数据库+lw
  16. VS_QT_4_Qt设计师
  17. 实验 3 电磁波垂直入射、透射和反射
  18. HBuilder 打包步骤
  19. 学习笔记(1):用友U8视频教程全集(全模块)-薪资管理
  20. 女极客因佩戴谷歌眼镜在美国酒吧遭袭击

热门文章

  1. 文本特征工程之N-Gram
  2. 大盘点!自动驾驶中基于Transformer的单目BEV感知
  3. “我学习win32com的秘诀”,本周六(7月1日)上午腾讯会议室见
  4. 2021-2027中国水溶厕纸市场现状及未来发展趋势
  5. Tlink平台 8266 MQTT温湿度 4路继电器控制源码
  6. 在html语言中br是什么标志,HTML: br 标签
  7. React Native 上拉加载
  8. 职场新人想要快速成长?这些excel技巧需要懂!
  9. Note 7爆炸门事件告诫科技行业:冒进的危害猛于虎!
  10. poj-2253 Frogger(最短路)