当前位置: 首页 > news >正文

MySQL -- 约束

1. 数据库约束

数据库约束时关系型数据库的一个重要功能,主要的作用是保证数据的有效性,也可以理解为数据的正确性(数据本身是否正确,关联关系是否正确) 人工检查数据的完整性工作量非常大,在数据库中定义一些约束,那么数据在写入数据库的时候,就会帮我们做一些校验.并且约束一般是在指定列上创建的.

2. 约束类型

类型说明
NOTNULL⾮空约束 (常用指定⾮空约束的列不能存储NULL值
DEFALUT默认约束(常用当没有给列赋值时使⽤的默认值
UNIQUE唯⼀约束(常用指定唯⼀约束的列每⾏数据必须有唯⼀的值
PRIMARYKEY主键约束(常用NOTNULL和UNIQUE的结合,可以指定⼀个列或多个列,有助于防⽌数据重复和提⾼数据的查询性能
FOREIGNKEY外键约束(目前不用)外键约束是⼀种关系约束,⽤于定义两个表之间的关联关系,可以确保数据的完整性和⼀致性
CHECK约束 (不用)⽤于限制列或数据在数据库表中的值,确保数据的准确性和可靠性

3. NOTNULL⾮空约束

定义表时某列不允许为NULL时,可以为列添加⾮空约束。

  • ⽐如创建⼀个学⽣表,学⽣名为NULL时,这条记录是不完整的

在这里插入图片描述
在这里插入图片描述

  • 此时需要约束学⽣名的列不能为NULL

在这里插入图片描述
在这里插入图片描述

  • 由于name列有⾮空约束,插⼊NULL值时报错,但插入name的正确值就能通过

在这里插入图片描述

  • 查看表结构,NULL列为NO表⽰值不允许为NULL,YES表⽰值可以为NUL

在这里插入图片描述

4. DEFALUT默认值约束

DEFAULT约束⽤于向列中插⼊默认值,如果没有为列设置值,那么会将默认值设置到该列.

  • 首先我们创建一个表,新增年龄列

示例:

在这里插入图片描述

  • 我们希望插入进来的数据,没有给定年龄时,会默认有年龄,那么我们重构学生表,为年龄加入默认约束在要加约束的列名后直接加default默认值即可
 create table family (id bigint,name varchar(20) NOT NULL,age int default 18);
  • 插⼊⼀条记录,不指定年龄的值时列使⽤了默认值

在这里插入图片描述

  • 查看表结构,年龄列的默认值为18

在这里插入图片描述

  • 当我们插入年龄列为NULL时,是否默认值还是18?但当⼿动明确指年龄列为NULL时列值为NULL,不会使用默认值

在这里插入图片描述

5. UNIQUE唯⼀约束

指定了唯⼀约束的列,该列的值在所有记录中不能重复,⽐如⼀个⼈的⾝份证号,学⽣的学号等

  • 重构学生表,id列后增加唯一约束
drop table if exists student;
create table student2 (
id bigint UNIQUE,
name varchar(20) not null
);
  • 我们发现不设置唯一约束时,id可以重复

在这里插入图片描述

  • 我们发现为id列添加唯一约束后,相同的则不能插入进去,唯一约束生效在这里插入图片描述

  • 在id列添加 UNIQUE关键字,为 id 设置唯一约束; 查看表结构,Key列显⽰UNI表⽰唯⼀约束
    在这里插入图片描述

  • 但当插入NULL值时,依旧可以插入
    在这里插入图片描述

6. PRIMARYKEY主键约束

主键约束唯⼀标识数据库表中的每条记录。
主键必须包含唯⼀的值,且不能包含NULL值。
每个表只能有⼀个主键,可以由单个列或多个列组成。
通常为每张表都指定⼀个主键,主键列建议使⽤BIGINT类型

  • 重构学⽣表,为ID列添加⾮空和唯⼀约束
drop table student;create table student (id bigint not null unique,name varchar(20) not null,age int DEFAULT 18,sno varchar(10) UNIQUE);
  • 查看表结构,添加了⾮空和唯⼀约束之后Key列显⽰PRI表⽰主键
    从此处我们可以知道 PRIMARY KEY= NOT NULL + UNIQUE在这里插入图片描述
  • 当Id列的值重复时会发⽣主键冲突
    在这里插入图片描述
  • 通常把主键列设置为⾃动增⻓auto_increment),让数据库维护主键值 PRIMARY KEY auto_increment
    在这里插入图片描述
  • 插⼊数据时不设置主键列的值
    在这里插入图片描述

上图中我们插错了一条数据,那我们的自增主键id会走到什么位置?2还是3 ?? 接着我们查看一下,此时发现id是从3开始的,这是为何?因为在数据库中插入数据正确或错误,自增主键都会向下走一步,不会回退,这样可以提高查询效率
在这里插入图片描述

  • 查看表结构,Extra列显⽰auto_increment表⽰⾃增
    在这里插入图片描述

  • 主键值是自增的,那么是否可以不连续呢?此时我们插入主键值为100的数据,我们发现插入成功,所以主键值可以不连续
    在这里插入图片描述

  • 那么我们发现,插入100主键值之后,自增主键将从哪里自增呢??我们发现:下一次自增从主键的最大值开始
    在这里插入图片描述

  • 主键或唯⼀键冲突时的更新操作,插⼊否则更新

1.插入
在这里插入图片描述

2.更新
可以使⽤以上语法,如果插⼊时有冲突则更新当前列的值, 两⾏受影响,表⽰删除了原来的记录,⼜新写⼊了⼀条记录其update student set name ='钱六',number='100011' where id=100;等效
在这里插入图片描述

3.替换
如果表中没有冲突则直接插入新数据,和insert的功能是一样的。

在这里插入图片描述
在这里插入图片描述

  • 表中不能有多个主键
 drop table student;# 重构学⽣表
create table student (id bigint PRIMARY KEY auto_increment,  # 定义主键
name varchar(20) PRIMARY KEY           
); # 定义主键
ERROR 1068 (42000): Multiple primary key defined # 报错

7. FOREIGNKEY外键约束

外键⽤于定义主表和从表之间的关系
外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束
当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为null。

7.1 语法

foreign key (id) references class(id)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 删除主表某条记录时,从表中不能有对该记录的引⽤

  • 删除主表时要先删除从表
    删除主表时,应该先解除主外键关系或者删除从表在这里插入图片描述

8. CHECK约束

可以应⽤于⼀个或多个列,⽤于限制列中可接受的数据值,从⽽确保数据的完整性和准确性。
在8.0.16开始全⾯⽀持CHECK约束,之前的版本会忽略CHECK的定义
但是注意,一般在应用程序级别校验

  • 重构学⽣表,有以下要求,年龄不能⼩于16岁,性别只能是男或⼥
create table student(id bigint PRIMARY KEY auto_increment, #设置⾃增主键name varchar(20) not null,age int DEFAULT 18,gender char(1),check (age >= 16),check (gender = '男' or gender = '⼥') 
);
  • c1的值不能为0,c2的值必须⼤于0,c3的值不⼩于c2
create table t_check (c1 int check(c1 <> 0),c2 int check(c2 > 0),c3 int,check(c3 >= c2));

相关文章:

MySQL -- 约束

1. 数据库约束 数据库约束时关系型数据库的一个重要功能,主要的作用是保证数据的有效性,也可以理解为数据的正确性(数据本身是否正确,关联关系是否正确) 人工检查数据的完整性工作量非常大,在数据库中定义一些约束,那么数据在写入数据库的时候,就会帮我们做一些校验.并且约束一…...

php 使用simplexml_load_string转换xml数据格式失败

本文介绍如何使用php函数解析xml数据为数组。 <?php$a <xml><ToUserName><![CDATA[ww8b77afac71336111]]></ToUserName><FromUserName><![CDATA[sys]]></FromUserName><CreateTime>1736328669</CreateTime><Ms…...

net-http-transport 引发的句柄数(协程)泄漏问题

Reference 关于 Golang 中 http.Response.Body 未读取导致连接复用问题的一点研究https://manishrjain.com/must-close-golang-http-responsehttps://www.reddit.com/r/golang/comments/13fphyz/til_go_response_body_must_be_closed_even_if_you/?rdt35002https://medium.co…...

高级软件工程-复习

高级软件工程复习 坐标国科大&#xff0c;下面是老师说的考试重点。 Ruby编程语言的一些特征需要了解要能读得懂Ruby程序Git的基本命令操作知道Rails的MVC工作机理需要清楚&#xff0c;Model, Controller, View各司什么职责明白BDD的User Story需要会写&#xff0c;SMART要求能…...

eslint.config.js和.eslintrc.js有什么区别

eslint.config.js 和 .eslintrc.js 的主要区别在于它们所对应的 ESLint 版本和配置方法&#xff1a; 1. .eslintrc.js&#xff1a; 这是 ESLint v8 及更早版本使用的配置文件格式。 它使用层级式的配置系统。 现在被称为"旧版"配置格式 。 2. eslint.config.js&am…...

如何使用MVC模式设计和实现校园自助点餐系统的微信小程序

随着智慧校园的普及&#xff0c;校园自助点餐系统在提高学生用餐效率、减轻食堂运营压力方面发挥了重要作用。 在开发这类系统时&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;模式是一种非常适合的架构&#xff0c;它将系统的业务逻辑、用户界面和数据交互清晰…...

继续坚持与共勉

经过期末考试后&#xff0c;又要开始学习啦。 当时一直在刷算法题就很少写博客了&#xff0c;现在要继续坚持写博客&#xff0c;将每天对于题的感悟记录下来。 同时我将会在学习Linux操作系统&#xff0c;对于过去学习的内容进行回顾&#xff01;&#xff01; 在此&#xff…...

人机交互 | 期末复习(上)| 补档

文章目录 📚1-HCI Introduction🐇人机交互的定义,分别解释人-机-交互的概念🐇six ”mantras“ of UCD🐇Difference between User-Interface (UI) and User-Experience(UX)📚2-HCI history🐇WIMP🐇WYSIWYG📚3-Understanding User🐇Design Thinking Process的…...

Oracle 表分区简介

目录 一. 前置知识1.1 什么是表分区1.2 表分区的优势1.3 表分区的使用条件 二. 表分区的方法2.1 范围分区&#xff08;Range Partitioning&#xff09;2.2 列表分区&#xff08;List Partitioning&#xff09;2.3 哈希分区&#xff08;Hash Partitioning&#xff09;2.4 复合分…...

多并发发短信处理(头条项目-07)

1 pipeline操作 Redis数据库 Redis 的 C/S 架构&#xff1a; 基于客户端-服务端模型以及请求/响应协议的 TCP服务。客户端向服务端发送⼀个查询请求&#xff0c;并监听Socket返回。通常是以 阻塞模式&#xff0c;等待服务端响应。服务端处理命令&#xff0c;并将结果返回给客…...

网络编程的进程查看连接描述符信息等

一.查看当前进程的socket对应的fd信息 1. lsof lsof&#xff08;List Open Files&#xff09;命令可以列出系统中所有打开的文件的信息&#xff0c;包括 socket。 用法 要查看特定进程的 socket 信息&#xff0c;可以使用以下命令&#xff1a; lsof -p <pid> | grep…...

ChatGPT API快速搭建自己的第一个应用—文章摘要(单轮对话应用)

使用ChatGPT API快速搭建自己的第一个应用 1 安装库2 设置与导入3 文章摘要(单轮对话应用)3.1 任务简介:3.2 初始化3.3 点击发送3.4 保存3.5 检查并打印你的结果1 安装库 !pip install gradiogradio 是一个用于快速搭建交互式用户界面的 Python 库,特别适合展示机器学习模…...

【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈

【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机&#xff0c;子弹&#xff0c;爆炸特效以及导出png序列图-优雅草央千澈 开发背景 优雅草央千澈所有的合集&#xff0c;系列文章可能是不太适合完全初学者的&#xff0c;因为课程不会非常细致的系统…...

软件测试预备知识④—NTFS权限管理、磁盘配额与文件共享

在软件测试的实际环境搭建与管理过程中&#xff0c;了解和掌握NTFS权限管理、磁盘配额以及文件共享等知识至关重要。这些功能不仅影响系统的安全性和稳定性&#xff0c;还对测试数据的存储、访问以及多用户协作测试有着深远的影响。 一、NTFS权限管理 1.1 NTFS简介 NTFS&am…...

CI/CD 流水线

CI/CD 流水线 CI 与 CD 的边界CI 持续集成CD&#xff08;持续交付/持续部署&#xff09;自动化流程示例&#xff1a; Jenkins 引入到 CI/CD 流程在本地或服务器上安装 Jenkins。配置 Jenkins 环境流程设计CI 阶段&#xff1a;Jenkins 流水线实现CD 阶段&#xff1a;Jenkins 流水…...

【python3】 sqlite格式的db文件获得所有表和数据

【python3】 sqlite格式的db文件获得所有表和数据 1.背景2.代码3.解析1.背景 SQLite 格式的 .db 文件就是一个包含 SQLite 数据库的文件。 SQLite 格式的 .db 文件通常存储的是一个关系型数据库。 SQLite广泛用于应用程序、移动设备、浏览器等场景。它将整个数据库存储在一个文…...

【灵码助力安全3】——利用通义灵码辅助智能合约漏洞检测的尝试

前言 随着区块链技术的快速发展&#xff0c;智能合约作为去中心化应用&#xff08;DApps&#xff09;的核心组件&#xff0c;其重要性日益凸显。然而&#xff0c;智能合约的安全问题一直是制约区块链技术广泛应用的关键因素之一。由于智能合约代码一旦部署就难以更改&#xf…...

openEuler 22.04使用yum源最快速度部署k8s 1.20集群

本文目的 openEuler的官方源里有kubernetes 1.20&#xff0c;使用yum源安装是最快部署一个k8s集群的办法 硬件环境 主机名系统架构ipmasteropenEuler release 22.03 (LTS-SP2)arm192.168.3.11edgeopenEuler release 22.03 (LTS-SP2)arm192.168.3.12deviceopenEuler release 22.…...

Docker Compose 教程

Docker Compose 是一个 Docker 容器的依赖管理工具。 例如我们一个服务需要依赖到多个 Docker 容器&#xff0c;那么使用 Docker Compose 这个工具就能很方便的帮助我们管理。 Docker Compose 通过配置文件 .yml。 定义了所有容器的依赖关系。 然后我们只需把我们想要的 Docke…...

opencv的NLM去噪算法

NLM&#xff08;Non-Local Means&#xff09;去噪算法是一种基于图像块&#xff08;patch&#xff09;相似性的去噪方法。其基本原理是&#xff1a; 图像块相似性&#xff1a;算法首先定义了一个搜索窗口&#xff08;search window&#xff09;&#xff0c;然后在该窗口内寻找…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...