MySQL数据完整性约束
数据完整性是指数据的正确性和相容性,是为了防止数据库中存在不符合语义的数据,即防止数据库中存在不正确的数据。在MySQL中提供了多种完整性约束。
1、主键约束
主键可以是表中的某一列,也可以是表中的多个列所构成的一个组合;其中,由多个列组合而成的主键也称为复合主键。在MySQL中,主键列必须遵守以下规则。
(1)每一个表只能定义一个主键。
(2)唯一性原则。主键的值,也称键值,必须能够唯一表示表中的每一条记录,且不能为NULL。
(3)最小化规则。复合主键不能包含不必要的多余列。也就是说,当从一个复合主键中删除一列后,如果剩下的列构成的主键仍能满足唯一性原则,那么这个复合主键是不正确的。
(4)一个列名在复合主键的列表中只能出现一次。
示例:创建学生信息表tb_student时,将学号(stu_id)字段设置为主键。
CREATE TABLE tb_student
(stu_id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(30)
);
示例:创建用户信息表tb_student时,将学号(stu_id)和所在班级号(class_id)字段设置为复合主键。
CREATE TABLE tb_student
(stu_id INT AUTO_INCREMENT,name VARCHAR(30),class_id INT NOT NULL,PRIMARY KEY (stu_id,class_id)
);
示例:通过修改数据表结构,添加主键约束。
ALTER TABLE tb_student ADD CONSTRAINT PRIMARY KEY(stu_id);
2、唯一约束
唯一约束使用UNIQUE关键字来定义。唯一约束的值必须是唯一的,且不能为空(NULL)。
在MySQL中,唯一约束与主键之间存在以下两点区别。
(1)一个表只能创建一个主键,但可以定义多个唯一约束。
(2)定义主键约束时,系统会自动创建PRIMARY KEY索引,而定义候选键约束时,系统会自动创建UNIQUE索引。
示例:创建用户信息表tb_student时,将学号(stu_id)和姓名(name)设置为唯一约束。
CREATE TABLE tb_student
(stu_id INT UNIQUE,name VARCHAR(30) UNIQUE
);
示例:创建用户信息表tb_student时,将学号(stu_id)和姓名(name)字段设置为复合唯一约束。
CREATE TABLE tb_student
(stu_id INT,name VARCHAR(30),UNIQUE uniq_id_name (stu_id,name)
);
示例:通过修改数据表结构,添加唯一约束。
ALTER TABLE tb_student ADD CONSTRAINT uniq_id_name UNIQUE(stu_id,name);
3、外键约束
MySQL有两种常用的引擎类型(MyISAM和InnoDB),目前,只用InnoDB引擎类型支持外键约束。
示例:创建班级信息表(tb_class)和学生信息表(tb_student),并设置学生信息表中班级编号(class_id)字段的外键约束。
-- 创建班级信息表
CREATE TABLE tb_class
(class_id INT AUTO_INCREMENT PRIMARY KEY,class_name VARCHAR(30) NOT NULL
);-- 创建学生信息表,并设置班级ID的外键约束
CREATE TABLE tb_student
(stu_id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(30),class_id INT NOT NULL,FOREIGN KEY fk_class_id (class_id)REFERENCES tb_class(class_id)
);
示例:通过修改数据表结构,添加外键约束。
ALTER TABLE tb_student ADD CONSTRAINT FOREIGN KEY fk_class_id (class_id) REFERENCES tb_class(class_id);
4、非空约束
非空约约束就是限制必须为某个列提供值。空值(NULL)是不存在值,它既不是数字0,也不是空字符串,而是不存在、未知的情况。
示例:创建学生信息表tb_student时,将姓名(name)字段添加为非空约束。
CREATE TABLE tb_student
(stu_id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(30) NOT NULL
);
示例:通过修改数据表结构,将姓名(name)字段修改为非空。
ALTER TABLE tb_student MODIFY COLUMN name VARCHAR(30) NOT NULL;
5、检查约束
检查约束用来指定某列的可取值的范围,它通过限制输入到列中的值来强制域的完整性。
示例:创建学生信息表tb_student时,将年龄(age)的值设置在7至18之间(不包括18)的数值。
CREATE TABLE tb_student
(stu_id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(30),age INT NOT NULL CHECK(age>=7 AND age<18)
);
注意:目前的MySQL版本只是对CHECK约束进行了分析处理,但会被直接忽略,并不会报错。
6、约束的删除
删除约束语法:
ALTER TABLE 表名 DROP [FOREIGN KEY| INDEX 约束名称]|[PRIMARY KEY]
示例:删除约束。
CREATE TABLE tb_student
(stu_id INT,name VARCHAR(30) ,class_id INT NOT NULL,-- 主键约束PRIMARY KEY(stu_id),-- 外键约束FOREIGN KEY fk_class_id (class_id)REFERENCES tb_class(class_id),-- 唯一性约束UNIQUE uniq_name (name)
);-- 删除主键约束
ALTER TABLE tb_student DROP PRIMARY KEY;-- 删除外键约束
ALTER TABLE tb_student DROP FOREIGN KEY fk_class_id;-- 删除唯一性约束
ALTER TABLE tb_student DROP INDEX uniq_name;
MySQL数据完整性约束相关推荐
- mysql数据完整性约束包括_MYSQL回顾(完整性约束相关)
简介 MYSQL完整性约束条件主要包括: auto_increment not null 和 default unique primary key foreign key unique. primar ...
- [MySQL/初学者]数据完整性约束
前言 数据完整性约束的概念: 在表中定义完整性约束是作为数据定义的一部分,定义了完整性约束,数据库会随时检测处于更新状态的数据库内容是否符合相关的完整性约束,保证数据的正确性与一致性. 完整性约束既 ...
- MySQL入门之数据完整性约束与表维护
---------------------------------------------------------------------------------------------------- ...
- mysql实验五索引和数据完整性_实验六 索引和数据完整性约束
实验六索引和数据完整性约束 一.实验内容: 1. 索引的创建 2. 数据完整性约束的创建 二.实验项目:员工管理数据库 用于企业管理的员工管理数据库,数据库名为YGGL中,YGGL数据库中包括三个表: ...
- MySQL表完整性约束
=======MySQL表完整性约束======目录:一.介绍二.not null 与 default三.unique四.primary key五.auto_increment六.foreign ke ...
- mysql数据表操作_MySQL数据表基本操作实例详解
本文实例讲述了MySQL数据表基本操作.分享给大家供大家参考,具体如下: 数据表的基本操作 1.主键约束要求主键列的数据唯一,并且不允许为空.主键能够唯一地识别表中的一条记录,可以结合外键来定义不同数 ...
- MySQL数据操作与查询笔记 • 【第2章 表结构管理】
全部章节 >>>> 本章目录 2.1 关系模型与数据表 2.1.1 关系模型 2.1.2 数据表 2.2 MySQL 数据类型 2.2.1 MySQL 常见数据类型 2.2 ...
- 删除列级完整性约束_MySQL中的数据完整性约束
原标题:MySQL中的数据完整性约束 作者:Airy 在数据分析之路狂奔,立志成为大咖级人物. 前面已经学习了常用数据类型和表的操作,其中表的操作中提到了数据完整性约束条件,今天来详细说一下各种完整性 ...
- MySQL之完整性约束
数据完整性指的是数据的一致性和正确性.完整性约束是指数据库的内容必须随时遵守的规则.若定义了数据完整性约束,MySQL会负责数据的完整性,每次更新数据时,MySQL都会测试新的数据内容是否符合相关的完 ...
最新文章
- R探索新数据分析(Exploratory Data Analysis,EDA)
- mysql多语句查询结果_MySQL查询从多个选择语句获取结果?
- 解决input[type=number]无法显示非数字字符的问题
- UI常见测试用例-51testing
- linux kernel中的栈的介绍
- superset安装配置
- Spring自动扫描组件
- mysql注入5.0以上_[Injection]对MYSQL 5.0服务器以上版本注入
- 好程序员web前端分享详细了解JavaScript函数
- 地域跨度入手的8zsb
- 支付宝二面微服务、分布式架构?太真实了!
- 自适应网页设计(转)
- Fedora16 下更改多系统、多内核的默认启动项
- ASP.NET WebForm Best Practice 之PostBack
- php代码执行函数解析
- 小学计算机房荷载,资深暖通设计师总结的常用参数参考值,新手们都说感谢大神支招...
- 正则表达式 REGEX-Regular Expression
- 红米note4x装linux,红米Note4X自己安装Magisk的过程
- 一些最基本的健身知识分享
- Unity3D射击类游戏制作第三节--游戏模型
热门文章
- python列表元组字典集合实验心得_python学习小总结(列表、元组、字典、集合、字符串)...
- Essential Google Cloud Infrastructure: Foundation
- 关于安卓系统4.0/5.0/6.0获取单卡手机,双卡手机的imei1,imei2,meid(用反射来实现,史上最详细,最全面获取)--binbinyang
- js设置,获取,删除属性(setAttribute, getAttribute, removeAttribute)
- 北斗时钟服务器(GPS卫星同步时钟)应用电子政务系统
- 最优化方法之黄金分割法,为什么是0.618?
- Matlab如何调整坐标轴刻度
- Java线程池(超详细)
- 手写:下划线转为驼峰命名法
- 【IEEE_Verilog-4.4】Verilog中的充电强度charge strength和驱动强度drive strength