【教程】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,我的博客将首发在上面~

文末标志

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【求助】西门子S7-200PLC定时中断+数据归档的使用

前言 已经经历了种种磨难来记录我的数据&#xff08;使用过填表程序、触摸屏的历史记录和数据归档&#xff09;之后&#xff0c;具体可以看看这篇文章&#xff1a;&#x1f6aa;西门子S7-200PLC的数据归档怎么用&#xff1f;&#xff0c;出现了新的问题。 问题的提出 最新的…

25 - MOV 指令

---- 整理自B站UP主 踌躇月光 的视频 文章目录 1. 指令系统设计2. MOV 指令3. 实现3.1 CPU 电路图3.2 代码实现3.3 实验过程3.4 实验结果3.5 实验工程 1. 指令系统设计 指令 IR 8 位程序状态字 4 位微程序周期 4 位 2. MOV 指令 MOV A, 5; 立即寻址 MOV A, B; 寄存器寻址 MO…

基于PaddlePaddle平台训练物体分类——猫狗分类

学习目标&#xff1a; 在百度的PaddlePaddle平台训练自己需要的模型&#xff0c;以训练一个猫狗分类模型为例 PaddlePaddle平台&#xff1a; 飞桨&#xff08;PaddlePaddle&#xff09;是百度开发的深度学习平台&#xff0c;具有动静统一框架、端到端开发套件等特性&#xf…

tailwindcss在使用cdn引入静态html的时候,vscode默认不会提示问题

1.首先确保vscode下载tailwind插件&#xff1a;Tailwind CSS IntelliSense 2.需要在根目录文件夹创建一个tailwind.config.js文件 export default {theme: {extend: {// 可根据需要自行配置&#xff0c;空配置项可以正常使用},}, }3.在html文件的标签中引入配置文件&#xf…

程序员到架构师,除了代码,还有文档和图

文章目录 前言一、书面设计文档文档应该作为代码和口头交流的补充文档应该注意鲜活 二、图——架构讨论的直观语言总结 前言 作为人类&#xff0c;我们天生就被视觉所吸引。在这个信息爆炸的时代&#xff0c;从精炼的代码到清晰的文档&#xff0c;再到直观的图&#xff0c;我们…

【数据结构】串(String)

文章目录 基本概念顺序存储结构比较当前串与串s的大小取子串插入删除其他构造函数拷贝构造函数扩大数组空间。重载重载重载重载[]重载>>重载<< 链式存储结构链式存储结构链块存储结构 模式匹配朴素的模式匹配算法(BF算法)KMP算法字符串的前缀、后缀和部分匹配值nex…

Parade Series - CoreAudio Reformating

// 获得音频播放设备格式信息CComHeapPtr<WAVEFORMATEX> pDeviceFormat;pAudioClient->GetMixFormat(&pDeviceFormat);constexpr int REFTIMES_PER_SEC 10000000; // 1 reference_time 100nsconstexpr int REFTIMES_PER_MILLISEC 10000;// Microsoftif (p…

Golang | Leetcode Golang题解之第49题字母异位词分组

题目&#xff1a; 题解&#xff1a; func groupAnagrams(strs []string) [][]string {mp : map[[26]int][]string{}for _, str : range strs {cnt : [26]int{}for _, b : range str {cnt[b-a]}mp[cnt] append(mp[cnt], str)}ans : make([][]string, 0, len(mp))for _, v : ra…

Alibaba 的fastjson源码详解

一、概述 Fastjson 是阿里巴巴开源的一个 Java 工具库&#xff0c;它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。 Fastjson 可以操作任何 Java 对象&#xff0c;即使是一些预先存在的没有源码的对象。 二、源码分析 1.首先以fastjson-1.2.70为例&#xff0c;…

nodejs

334 先下载zip文件&#xff0c;然后加上.zip,可以看到两个文件 在user中可以看到 输入即可得到flag。 335. 这里提到eval函数&#xff0c;eval中可以执行js代码&#xff0c;可以尝试使用这个函数进行测试 payload&#xff08;显示当前目录下的文件和文件夹列表&#xff09; …

基于emp的mysql查询

SQL命令 结构化查询语句&#xff1a;Structured Query Language 结构化查询语言是高级的非过程化变成语言&#xff0c;允许用户在高层数据结构上工作。是一种特殊目的的变成语言&#xff0c;是一种数据库查询和程序设计语言&#xff0c;用于存取数据以及查询、更新和管理关系数…

Python 网络与并发编程(四)

文章目录 协程Coroutines协程的核心(控制流的让出和恢复)协程和多线程比较协程的优点协程的缺点 asyncio实现协程(重点) 协程Coroutines 协程&#xff0c;全称是“协同程序”&#xff0c;用来实现任务协作。是一种在线程中&#xff0c;比线程更加轻量级的存在&#xff0c;由程…

android脱壳第二发:grpc-dumpdex加修复

上一篇我写的dex脱壳&#xff0c;写到银行类型的app的dex修复问题&#xff0c;因为dex中被抽取出来的函数的code_item_off 的偏移所在的内存&#xff0c;不在dex文件范围内&#xff0c;所以需要进行一定的修复&#xff0c;然后就停止了。本来不打算接着搞得&#xff0c;但是写了…

基础SQL DCL语句

DCL是数据控制语言&#xff0c;用来管理数据库用户&#xff0c;还有控制用户的访问权限 1.用户的查询 MySQL的用户信息存储在mysql数据库中&#xff0c;查询用户时&#xff0c;我们需要使用这个数据库。 后面&#xff0c;还有很多数据&#xff0c;因为篇幅的问题&#xff0c;就…

【FFmpeg】音视频录制 ② ( 使用 Screen Capturer Recorder 软件生成 ffmpeg 可录制的音视频设备 )

文章目录 一、使用 Screen Capturer Recorder 软件生成音视频设备1、设备查找问题 - 引入 Screen Capturer Recorder 软件2、下载安装 Screen Capturer Recorder 软件3、验证 Screen Capturer Recorder 生成的设备 一、使用 Screen Capturer Recorder 软件生成音视频设备 1、设…

【PyTorch】torch.gather() 用法

gather常被用于image做mask的操作中&#xff0c;对哪些地方进行赋值0/1 API&#xff1a; torch.gather — PyTorch 2.2 documentation torch.gather(input, dim, index, outNone) → Tensor gather()的意义&#xff1a; 顾名思义&#xff0c;聚集、集合&#xff1a;gather…

在mac上安装node.js及使用npm,yarn相关命令教程

1、安装node.js 官网&#xff1a;Node.js — Download Node.js 选择需要的版本&#xff0c;点击DownLoad 2、点击继续&#xff0c;直到安装成功。 2.1打开终端输入命令node -v 显示版本号则说明已安装成功 3、全局安装yarn命令 1、sudo npm install --global yarn &#xf…

Python构建学生信息管理系统:构建RESTful API - 学生信息管理系统的后端逻辑

在之前的博客里&#xff0c;我们已经完成了项目初始化&#xff0c;在本篇博客中&#xff0c;我们将深入探讨如何使用Flask框架实现学生信息管理系统的后端逻辑&#xff0c;特别是通过RESTful API来实现学生信息的增删改查&#xff08;CRUD&#xff09;操作。 Flask RESTful AP…

计网笔记:第1章 计算机网络概论

计网笔记&#xff1a;第1章 计算机网络概论 第1章 计算机网络概论1.1 计算机网络发展与分类1.2 OSI和TCP/IP参考模型OSI与TCP/IP参考模型图 1.3 数据封装与解封过程借助OSI模型理解数据传输过程(封装)借助OSI模型理解数据传输过程(解封) 1.4 本章例题 第1章 计算机网络概论 1.…