【教程】MySQL数据库学习笔记(五)——约束(持续更新)

文首标志
写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!


【MySQL数据库学习】系列文章

第一章 《认识与环境搭建》
第二章 《数据类型》
第三章 《数据定义语言DDL》
第四章 《数据操作语言DML》
第五章 《约束》


文章目录

  • 【MySQL数据库学习】系列文章
    • 一、约束介绍
    • 二、常用约束
      • (一)主键约束
        • 1.添加单列主键
        • 2.添加联合主键
        • 3.修改表结构添加主键
        • 4.删除主键
      • (二)自增长约束
      • (三)非空约束
      • (四)唯一约束
      • (五)默认约束


一、约束介绍

约束(Constraints) 是用于强制数据库中数据完整性和一致性的规则。它们定义了对表中数据的限制,确保数据的有效性和正确性,实际上就是表中数据的限制条件。例如,用户表的有些列(比如手机号)不能为空,有些列的值(比如身份证)不能重复等规则就是添加的约束条件。

约束主要的分类有以下常见类别:

  • 数据完整性约束
    • 主键约束(Primary Key Constraint)
      确保每行数据在指定列或列组合上具有唯一标识,并且不允许包含NULL值。
    • 外键约束(Foreign Key Constraint)
      确保表中的外键列的值必须存在于另一个表的主键列中,保持引用完整性。
    • 唯一约束(Unique Constraint)
      确保指定列中的所有值都是唯一的,但允许包含NULL值。
    • 检查约束(Check Constraint)
      用于确保特定列中的值满足指定的条件,例如范围、格式等,以确保数据的一致性。
    • 自增长约束(Auto Increment Constraint)
      确保在插入新记录时,列中的值自动按顺序递增。
  • 数据格式约束
    • 默认约束(Default Constraint)
      用于确保特定列中的值满足指定的条件,例如范围、格式等,以确保数据的一致性。
    • 零填充约束(Zero Padding Constraint)
      确保列中的值采用零填充以达到特定长度的要求。
  • 空值约束
    • 非空约束(Not Null Constraint)
      用于确保特定列中的值满足指定的条件,例如范围、格式等,以确保数据的一致性。

常用的约束有主键约束自增长约束非空约束唯一约束默认约束等。

二、常用约束

(一)主键约束

主键约束(Primary Key Constraint) 是一个列或多个列的组合,其值能唯一地标识表中的每一行,方便在关系型数据库中尽快地找到特定的某一行数据。主键约束相当于唯一约束+非空约束,即主键约束列不允许重复,也不允许出现空值(NULL值),创建主键约束时,系统会默认在所在列和列组合上建立对应的唯一索引。

需要注意的是每个表只能有一个主键,此主键可以是一列,也可以是多列的组合(只要保证组合唯一即可)。关键字是PRIMARY KEY

关于主键约束的操作有以下几种:

  • 添加单列主键
  • 添加多列联合主键
  • 删除主键
1.添加单列主键

创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段后再指定主键。

第一种方式的语法如下。

CREATE TABLE 表名 (...<字段名> <数据类型> PRIMARY KEY...
);

下面是第一种方式的一个简单的示例。

USE mydb1;
-- 第一种方式
CREATE TABLE IF NOT EXISTS emp1 (eid INT PRIMARY KEY,name VARCHAR(20),deptID INT,salary DOUBLE
);

此时就可以设置eid列为主键列。

第二种方式的语法如下。

CREATE TABLE 表名 (...[CONSTRAINT <约束名>] PRIMARY KEY (字段名)
);

约束名由于不强制添加,不填写约束名也可以。

下面是第二种方式的一个简单的示例。

-- 第二种方式
CREATE TABLE IF NOT EXISTS emp2 (eid INT,name VARCHAR(20),deptID INT,salary DOUBLE,CONSTRAINT pk1 PRIMARY KEY(eid) -- CONSTRAINT pk1可以省略
);

主键约束已经添加完毕了,具体作用可以通过一个示例验证。

INSERT INTO emp2 VALUES(1001,'John',10,5000);
INSERT INTO emp2 VALUES(1001,'Mike',20,6000);

此时会返回错误如下。

INSERT INTO emp2 VALUES(1001,'John',10,5000)
> 1062 - Duplicate entry '1001' for key 'emp2.PRIMARY'
> 查询时间: 0s

这就说明,对于已经设置主键约束的列的值不能重复。

INSERT INTO emp2 VALUES(NULL,'Mike',20,6000);

而如果将添加的一行数据中eid值设置为空值,也会报错。

INSERT INTO emp2 VALUES(NULL,'Mike',20,6000)
> 1048 - Column 'eid' cannot be null
> 查询时间: 0s

这就说明,对于已经设置主键约束的列的值也不能为空。

2.添加联合主键

所谓的联合主键,就是指主键由多个字段组成,而此时就无法在某个字段定义同时指定主键了,语法如下。

CREATE TABLE 表名 (...[CONSTRAINT <约束名>] PRIMARY KEY (字段1,字段2,...,字段n)
);

下面是一个简单的示例。

CREATE TABLE IF NOT EXISTS emp3 (name VARCHAR(20),deptID INT,salary DOUBLE,PRIMARY KEY(name,deptID)
);

此例去除了eid,转而将姓名name和部门IDdeptID作为列组合设置主键约束。同单列主键一样,联合主键的每一个列都受到主键约束,即非空且唯一。

3.修改表结构添加主键

除了以上通过CREATE TABLE关键字设置主键约束的方法,指定主键也可以通过修改表结构来实现,语法如下。

CREATE TABLE 表名 (...
);
ALTER TABLE 表名 ADD PRIMARY KEY(指定字段1,指定字段2,,...,指定字段n);

下面是一个简单的示例。

CREATE TABLE IF NOT EXISTS emp4 (eid INT,name VARCHAR(20),deptID INT,salary DOUBLE
);
ALTER TABLE emp4 ADD PRIMARY KEY(eid);
4.删除主键

一个表中不再需要主键约束时,就可以将主键约束删除,而这通过修改表结构来实现,语法如下。

ALTER TABLE <表名> DROP PRIMARY KEY;

可以看到,无论是删除单列主键还是联合主键,都不需要指定主键名,由于表中只允许出现一个主键,所以使用删除语句就会自动指定唯一主键进行删除。

(二)自增长约束

在MySQL中,当主键定义为自增长后,这个值就不需要用户输入数据了,而是数据库根据定义直接自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。这可以通过给字段添加AUTO_INCREMENT属性来实现主键自增长,语法如下。

<字段名> <数据类型> PRIMARY KEY AUTO_INCREMENT

下面是一个简单的示例。

CREATE TABLE IF NOT EXISTS user1 (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20)
);
INSERT INTO user1 VALUES(NULL,'John');
INSERT INTO user1(name) VALUES('Mike');

可以看到,此例插入的数据并没有指定id字段的值,但查看表会发现此字段被自动升序赋值数字。
在这里插入图片描述
需要注意的是,自增长约束只能增加到主键上,并且数据类型只能是整型。

而如果想要更改自增长开始的数字,则可以在示例的基础上增加一些语句,在创建表的时候设置如下。

CREATE TABLE IF NOT EXISTS user1 (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20)
)AUTO_INCREMENT=100; -- 设置开始数字从100开始

通过修改表结构实现如下。

CREATE TABLE IF NOT EXISTS user1 (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20)
);
ALTER TABLE user1 AUTO_INCREMENT=100; -- 设置开始数字从100开始

需要注意的是,当使用DELETETRUNCATE删除数据后,自增长的起点是不同的:如果使用DELETE删除了数据,增长后会在断点后继续增长;而如果使用TRUNCATE则默认从初始值开始增长。

(三)非空约束

非空约束(Not Null Constraint) 是指令字段的值不能为空的约束。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,系统就会报错,语法如下。

<字段名> <数据类型> NOT NULL; -- 方式1:在创建表时指定
ALTER TABLE <表名> MODIFY <字段名> <数据类型> NOT NULL; -- 方式2:通过修改表结构指定

以下是一个简单的示例。

CREATE TABLE IF NOT EXISTS emp1 (eid INT PRIMARY KEY,name VARCHAR(20) NOT NULL,deptID INT NOT NULL,salary DOUBLE
);

或者使用方式2。

CREATE TABLE IF NOT EXISTS emp1 (eid INT PRIMARY KEY,name VARCHAR(20),deptID INT,salary DOUBLE
);
ALTER TABLE emp1 MODIFY name VARCHAR(20) NOT NULL;
ALTER TABLE emp1 MODIFY deptID INT NOT NULL;

可以看到非空约束并不像主键约束一样只能指定一个,而是可以指定多个。

而如果想要删除以上添加的约束则使用如下语句。

ALTER TABLE emp1 MODIFY name VARCHAR(20);
ALTER TABLE emp1 MODIFY deptID INT;

可以看到,其实“删除”并非是真的通过某种语句删除了非空约束,而是通过MODIFY关键字重新修订表结构来去除之前指定的约束以实现“删除”的效果。

(四)唯一约束

**唯一约束(Unique Constraint)**是指所有记录中的值不能重复出现,否则报错,其语法如下。

<字段名> <数据类型> UNIQUE; -- 方式1:在创建表时指定
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(); -- 方式2:通过修改表结构指定

下面是方法一的一个简单的示例。

CREATE TABLE IF NOT EXISTS emp1 (eid INT UNIQUE,name VARCHAR(20),deptID INT,salary DOUBLE
);

可以看到,这里对于eid列指定了唯一约束,这也可以通过修改表结构来实现。

CREATE TABLE IF NOT EXISTS emp1 (eid INT,name VARCHAR(20),deptID INT,salary DOUBLE
);
ALTER TABLE emp1 ADD CONSTRAINT u1 UNIQUE(eid);

而删除此约束的语法如下。

ALTER TABLE 表名 DROP INDEX 约束名或列名;

这里需要注意的是如果赋予约束名则可以通过约束名定位到约束,而如果像第一种方式在创建表的时候指定了约束,并没有约束名时,字段名(列名)也可以定位到约束。

(五)默认约束

默认约束(Default Constraint) 可以用来指定某列的默认值,语法如下。

<字段名> <数据类型> DEFAULT <默认值>; -- 方式1:在创建表时指定
ALTER TABLE <表名> MODIFY <字段名> <数据类型> DEFAULT <默认值>; -- 方式2:通过修改表结构指定
ALTER TABLE <表名> MODIFY <字段名> <数据类型>; -- 删除方法

默认约束指定方式和使用方式也类似于非空约束,所以这里不再演示,其效果就是在不重新赋值的情况下,此列默认显示设定的默认值。


我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!同时,欢迎你参观我的个人网站EliasChang.xyz,我的博客将首发在上面~

文末标志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基本命令之正则表达式(转义字符)

一&#xff1a;查看二进制文件 strings 命令&#xff1a;strings 文件名 生成链接文件 ln 命令&#xff1a;ln 选项 源文件(f1) 链接文件&#xff08;f2&#xff09; 软连接&#xff1a;eg:ln -s f1 f2 软链接不能跨分区链接&#xff0c;但可以在同一分区的不同目录下链接…

go+react实现远程vCenter虚拟机管理终端

文章目录 React-VcenterDemoQuick Start React-Vcenter 基于go & react实现远程vSphere vcenter虚拟机终端console页面&#xff0c;提供与vcenter管理中的Launch Web Console相同的功能。 项目地址&#xff1a;react-vcenter Demo URL: http://localhost:3000 Quick St…

3-氨基苯硼酸接枝的透明质酸(HA-PBA)和聚乙烯醇(PVA )水凝胶负载胶束和药物

3-氨基苯硼酸接枝的透明质酸&#xff08;HA-PBA&#xff09;和聚乙烯醇&#xff08;PVA &#xff09;水凝胶负载胶束和药物 苯硼酸酯交联形成水凝胶的步骤&#xff1a; HA-PBA的制备&#xff1a;首先&#xff0c;3-氨基苯硼酸通过与透明质酸&#xff08;HA&#xff09;中的羧基…

Selenium web自动化测试环境搭建

Selenium web自动化环境搭建主要要经历以下几个步骤&#xff1a; 1、安装python 在python官网&#xff1a;Welcome to Python.org&#xff0c;根据各自对应平台如&#xff1a;windows&#xff0c;下载相应的python版本。 ​ 下载成功后&#xff0c;点击安装包&#xff0c;一直…

数据结构10:堆和堆排序

文章目录 树的概念及结构树的概念树的相关概念树的表示树在实际中的应用表示文件系统的目录树结构 二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构顺序存储链式存储 二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构 堆的实现堆的插入堆的删除堆的创建向…

【数据结构】08排序

08 排序 1. 冒泡排序&#xff08;BubbleSort&#xff09;1.1 循环嵌套实现1.2 递归实现 2. 选择排序2.1 嵌套循环实现2.2 递归实现 3. 插入排序4. 希尔排序4.1 代码实现 5. 快速排序5.1 代码实现6. 归并排序6.1 递归实现6.2 循环实现 7. 堆排序7.1 构建大顶堆7.2 堆排序7.3 代码…

春秋云镜 CVE-2023-51048

靶标介绍&#xff1a; S-CMS v5.0 被发现存在SQLI。 开启靶场 根据题目查找S-CMS v5.0漏洞&#xff0c;百度没有查询到&#xff0c;使用必应搜索S-CMS v5.0 查找到githubCVE-2023-51052的描述 S-CMS v5.0 was discovered to contain a SQL injection... CVE-2023-51052 Git…

达梦数据库的AWR报告

达梦数据库的AWR报告 数据库快照是一个只读的静态的数据库。 DM 快照功能是基于数据库实现的&#xff0c;每个快照是基于数据库的只读镜像。通过检索快照&#xff0c;可以获取源数据库在快照创建时间点的相关数据信息。 为了方便管理自动工作集负载信息库 AWR&#xff08;Auto…

C++修炼之路之多态---多态的原理(虚函数表)

目录 一&#xff1a;多态的原理 1.虚函数表 2.原理分析 3.对于虚表存在哪里的探讨 4.对于是不是所有的虚函数都要存进虚函数表的探讨 二&#xff1a;多继承中的虚函数表 三&#xff1a;常见的问答题 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗--…

Vue3+TS版本Uniapp:封装uni.request请求配置

作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 封装请求配置项 封装拦截器封装uni.request 封装拦截器 uniapp的封装逻辑不同于Vue3项目中直接使用axios.create()方法创建实例&#xff08;在create方法中写入请求…

【探讨】RocketMQ消息灰度方案-消息逻辑隔离

vivo 鲁班平台 RocketMQ 消息灰度方案 - 稀土掘金分布式- vivo鲁班RocketMQ平台的消息灰度方案MQ消息在生产环境和灰度环境隔离一般怎么实现?消息隔离的原则 中心正常消费者,可以同时消费正常的消息和特定标签的消息(自动识别);特定标签的消费者,只能消费特定标签的消息。灰…

内存管理下及模板初阶

嗨喽&#xff0c;今天阿鑫给大家带来内存管理下以及模板初阶的博客&#xff0c;下面让我们开始今天的学习吧&#xff01; 内存管理下及模板初阶 new和delete的实现原理定位new表达式(placement-new)常见面试题泛型编程函数模板类模板 1. new和delete的实现原理 1.1 内置类型…

用全连接对手写数字识别案例(附解决TensorFlow2.x没有examples问题)

数据集介绍 数据集直接调用可能出现问题&#xff0c;建议从官网直接下载下来&#xff0c;下载存在这四个文件 手写数字识别数据集下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nqhP4yPNcqefKYs91jp9ng?pwdxe1h 提取码&#xff1a;xe1h 55000行训练数据集&a…

【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)

【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09; 文章目录 【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09;一、搭建…

判断完数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int n 0;int i 1;int j 0;int result 1;//提示用户&#xff1b;printf("请输入一个…

目标检测网络YOLO进化之旅

yolo系列网络在目标检测领域取得了巨大的成功&#xff0c; 尤其是在工程实践中&#xff0c; 以其出色的性能优势获得了广泛的应用落地。 YOLO的前3个版本是由同一个作者团队出品&#xff0c; 算是官方版本。 之后的版本都是各个研究团队自己改进的版本&#xff0c; 之间并无明…

基础SQL DDL语句

MySQL的DDL&#xff08;Data Definition Language&#xff09;语句用于定义或修改数据库结构。 DDL数据库操作 查看所有的数据库 show databases; 红色圈起来的是系统数据库&#xff0c;是系统自带的 mysql&#xff1a;包含存储MySQL服务器运行时所需信息的表。这包括数据字典…

【Linux】MySQL的安装及配置(Ubuntu-18.04)

一、安装MySQL 分别安装MySQL服务器、MySQL客户端、C/C开发库 sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install libmysqlclient-dev 二、配置MySQL 1.查看默认配置文件&#xff0c;此处的user和password为默认提供的&#xff0c;…

Ceph 分布式文件系统 搭建及使用

一、Ceph 介绍 在当今数据爆炸式增长的时代&#xff0c;企业对于可靠、可扩展的存储解决方案的需求日益迫切。Ceph 作为一种开源的、可伸缩的分布式存储解决方案&#xff0c;正逐渐成为企业级存储领域的热门选择。Ceph是一种由Radicalbit公司开发的开源分布式存储系统&#xf…

ElasticSearch虚拟机安装(单机版)

1.下载7.10.2 下载链接&#xff0c;选择LINUX X86_64下载 2.创建用户 useradd es也可以使用系统默认用户&#xff08;非root&#xff09;,root用户会报错 3.解压 tar xvf elasticsearch-7.10.2-linux-x86_64.tar.gz假定目录在/home/es/elasticsearch-7.10.2-linux-x86_64 …