主键约束

主键可以是表中的某一列,也可以是表中的多个列所构成的一个组合;其中,由多个列组合而成的主键也称为复合主键。在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数据完整性约束的更多相关文章

  1. MySQL表完整性约束

    =======MySQL表完整性约束====== 目录: 一.介绍 二.not null 与 default 三.unique 四.primary key 五.auto_increment 六.for ...

  2. 笔记-3:mysql数据定义

    1.定义数据库 1.1 创建数据库:创建数据库是在系统磁盘上划分一块区域用于数据的存储和管理. # 基本语法: create {database | schema} [if not exists] d ...

  3. MySQL数据操作与查询笔记 • 【第2章 表结构管理】

    全部章节   >>>> 本章目录 2.1 关系模型与数据表 2.1.1 关系模型 2.1.2 数据表 2.2 MySQL 数据类型 2.2.1 MySQL 常见数据类型 2.2 ...

  4. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  5. Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)

    概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868 ...

  6. 两种适用于中小量数据的mysql数据备份

    近来项目的业务量开始大了,感觉如果数据不周期性地备份一下,很可能会出现问题,虽然我每天都有阿里云的自动快照,上网找了一下方法,找到两种相对简单而又适合中小项目或者中小公司的数据备份策略,以下都是数据库 ...

  7. 使用Solr索引MySQL数据

    环境搭建 1.到apache下载solr,地址:http://mirrors.hust.edu.cn/apache/lucene/solr/ 2.解压到某个目录 3.cd into D:\Solr\s ...

  8. MySQL数据的主从复制、半同步复制和主主复制详解

    一.MySQL复制概述 ⑴.MySQL数据的复制的基本介绍 目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费 ...

  9. ElasticSearch5+logstash的logstash-input-jdbc实现mysql数据同步

    在实现的路上遇到了各种坑,再次验证官方文档只能产考不能全信! ElasticSearch安装就不说了上一篇有说! 安装logstash 官方:https://www.elastic.co/guide/ ...

随机推荐

  1. mysql查看当前连接数

    show status like 'Threads%';   需要root权限才能看到所有的连接

  2. yum 卸载

    # yum list installed | grep [软件名] #yum -y remove [软件名]

  3. Nature | 多层次蛋白质组学综合分析冠状病毒侵染宿主细胞的分子机制

    冠状病毒是一种自然界普遍存在的单股正链RNA病毒,电镜下呈日冕状或皇冠状,故命名为冠状病毒.在本世纪初短短20年中,共爆发了三次冠状病毒疫情,即2003年SARS-CoV.2012年MERS-CoV和 ...

  4. 『Java』String类使用方法

    Java中的字符串 java.lang.String类表示字符串类,Java程序中所有字符串文字都可以看作实现该类的实例. 特点: 字符串不可变:字符串的值在创建后不能在发生改变 public cla ...

  5. 【笔记】使用PCA对数据进行降噪(理解)

    使用PCA对数据进行降噪(使用手写数字实例) (在notebook中) 加载库并制作虚拟的数据并进行绘制 import numpy as np import matplotlib.pyplot as ...

  6. Required request body is missing-请求接口报错

    一.问题由来 自己目前在做一个小程序的后台,已经写好了项目中的很多的接口,同时也在进行一些修改,比如添加拦截器,统一校验一个固定的参数是否正确. 在自己添加拦截器之前,这些接口都可以正常访问,可是在添 ...

  7. miniFTP项目实战四

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  8. 使用Java8改造出来的模板方法真的是yyds

    GitHub 21.3k Star 的Java工程师成神之路,不来了解一下吗! GitHub 21.3k Star 的Java工程师成神之路,真的不来了解一下吗! 我们在日常开发中,经常会遇到类似的场 ...

  9. (一)Linux之目录结构

    Linux之目录结构 目录 Linux之目录结构 一.概述 一.基本介绍 二.具体的目录结构(不用背,知道即可) Linux /usr目录 Linux /var 目录 一.概述 学习 Linux,不仅 ...

  10. SQL 练习6

    查询在 SC 表存在成绩的学生信息 SELECT * from Student WHERE SId in (SELECT SId from SC)