MySQL数据完整性约束
主键约束
主键可以是表中的某一列,也可以是表中的多个列所构成的一个组合;其中,由多个列组合而成的主键也称为复合主键。在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);
唯一约束
唯一约束使用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);
外键约束
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);
非空约束
非空约约束就是限制必须为某个列提供值。空值(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;
检查约束
检查约束用来指定某列的可取值的范围,它通过限制输入到列中的值来强制域的完整性。
示例:创建学生信息表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约束进行了分析处理,但会被直接忽略,并不会报错。
约束的删除
删除约束语法:
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;
文章转自:
https://blog.csdn.net/pan_junbiao/article/details/86158117
MySQL数据完整性约束的更多相关文章
- MySQL表完整性约束
=======MySQL表完整性约束====== 目录: 一.介绍 二.not null 与 default 三.unique 四.primary key 五.auto_increment 六.for ...
- 笔记-3:mysql数据定义
1.定义数据库 1.1 创建数据库:创建数据库是在系统磁盘上划分一块区域用于数据的存储和管理. # 基本语法: create {database | schema} [if not exists] d ...
- MySQL数据操作与查询笔记 • 【第2章 表结构管理】
全部章节 >>>> 本章目录 2.1 关系模型与数据表 2.1.1 关系模型 2.1.2 数据表 2.2 MySQL 数据类型 2.2.1 MySQL 常见数据类型 2.2 ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)
概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868 ...
- 两种适用于中小量数据的mysql数据备份
近来项目的业务量开始大了,感觉如果数据不周期性地备份一下,很可能会出现问题,虽然我每天都有阿里云的自动快照,上网找了一下方法,找到两种相对简单而又适合中小项目或者中小公司的数据备份策略,以下都是数据库 ...
- 使用Solr索引MySQL数据
环境搭建 1.到apache下载solr,地址:http://mirrors.hust.edu.cn/apache/lucene/solr/ 2.解压到某个目录 3.cd into D:\Solr\s ...
- MySQL数据的主从复制、半同步复制和主主复制详解
一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...
- ElasticSearch5+logstash的logstash-input-jdbc实现mysql数据同步
在实现的路上遇到了各种坑,再次验证官方文档只能产考不能全信! ElasticSearch安装就不说了上一篇有说! 安装logstash 官方:https://www.elastic.co/guide/ ...
随机推荐
- .net core连接Liunx上MS SQL Server
场景 由于业务要求,需要对甲方的一个在SQL Server上的财务表进行插入操作.研究了半天,因为一个小问题折腾了很久. 过程 .net core端: 1. 利用EF,就需要的导入相关的Nuget包, ...
- anyRTC 重磅推出在线实时 K 歌解决方案
在线音乐领域一直是各大资本巨头投资的热点,从抢占版权到现在的"云上之争", 主流平台的战火从版权资源转向创新领域扩延.而如今,在线K歌正在成为抢占"云音乐"市场 ...
- 02.反射Reflection
1. 基本了解 1.1 反射概述 文字说明 审查元数据并收集关于它的类型信息的能力称为反射,其中元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个 ...
- 如何从二维平面n个点中寻找距离最近两个点?
如何理解分治算法 什么是分治算法?简单来说就是"分而治之",也就是将原问题划分成n个规模较小的,并且结构与原问题相似的子问题,然后去递归地解决这些子问题,最后再合并其结果,就得到原 ...
- Java基础——自增自减及初识Math类
自增自减及初识Math类 public class Demon05 { public static void main(String[] args) { // ++ -- 自 ...
- [CISCN2019 华北赛区 Day2 Web1]Hack World(二分法写布尔注入脚本)
记一道布尔注入的题,存在过滤字符. 从题目看应该是一道注入题.提示存在flag表flag列. 输入1和2的返回结果不一样,可能是布尔注入. 简单用万能密码尝试了一下.提示SQL Injection C ...
- postman之get请求
get请求:
- Axure RP 9 安装
安装好的样子 官方安装包下载地址(速度较慢) 下载Axure RP 9 MAC版:https://axure.cachefly.net/AxureRP-Setup.dmg 下载Axure RP 9 P ...
- 如何用Git上传项目到GitHub
1.登录gitHub,进入主页面,点击"+"号,建立新仓库. 2. 输入自己的仓库名,和简单的描述,根据自己设置为公开的或私有的. 我输入的是仓库名为ESMS. 勾选此选项,rea ...
- Pikachu-File Inclusion模块
一.概述 文件包含,是一个功能.在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件. 比如 在PHP中,提供了:include(),inclu ...