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/ ...
随机推荐
- Windows下删除顽固文件夹
参考链接: https://www.cnblogs.com/azbane/p/9808802.html 第一步:修改当前文件夹所有者为管理员 takeown /f * /a /r 第二步:修改管理员权 ...
- WCF简单Demo
WCF,光看书的原理,稍微有点枯燥,通过自己动手,会更容易理解契约声明,面向服务,分布式等概念. 1.创建WCF服务. 2.WcfService1.CS中声明新的契约. namespace WcfSe ...
- Jenkins-CI 远程代码执行漏洞(CVE-2017-1000353)
影响范围 所有Jenkins主版本均受到影响(包括<=2.56版本) 所有Jenkins LTS 均受到影响( 包括<=2.46.1版本) poc下载 https://github.com ...
- C# WinForm 数据库连接及对数据库的相关操作
1.首先在App.config配置文件中配置数据库连接字符串: <appSettings> <add key="connectionstring" value=& ...
- ubuntu安装qemu
ubuntu安装qemu ubtuntu编译安装qemu 5.2.0,apt-get安装的版本过于老旧. 环境:ubuntu 18.04. wget https://download.qemu.org ...
- Java流程控制03——选择结构
选择结构 if单语句结构 我们很多时候要去判断一个东西是否可行,然后我们才去执行,这样一个过程我们用if语句来表示 语法 if(布尔表达式){ //如果布尔表达式结果为true将执行的语句 } if ...
- 靶机CH4INRULZ_v1.0.1
nmap开路. root@kali:~# nmap -sP 192.168.1.* //拿到靶机地址192.168.1.8 root@kali:~# nmap -p- -sS -v -sV 192.1 ...
- C++面向对象 1(类-封装)
1 //类和对象 2 //C++ 面向对象 三大特性 : 封装 继承 多态 3 4 //设计一个圆类,求圆的周长 5 //圆周长 = 2*PI * 半径 6 7 #include <iostre ...
- AspNetCore添加API限流
最近发现有客户在大量的请求我们的接口,出于性能考虑遂添加了请求频率限制. 由于我们接口请求的是.Net Core写的API网关,所以可以直接添加一个中间件,中间件中使用请求的地址当key,通过配置中心 ...
- Socket通信-客户端
WSADATA wsd; SOCKET sHost; SOCKADDR_IN servAddr; if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) retu ...