【MySQL】数据库约束

系列文章目录

第一章 数据库基础
第二章 数据库基本操作


文章目录

  • 系列文章目录
  • 前言
  • 约束关键字一览
  • NOT NULL
  • UNIQUE
  • DEFAULT
  • PRIMARY KEY
    • 自增主键
  • FOREIGN KEY
  • 总结


前言

在学习了数据库的增删改查操作之后,接下来就需要进阶的学习关键字来完善SQL语句的条件。学习数据库约束是为了能够更稳妥的保证数据的安全,以更加严格的标准来管理数据。


约束关键字一览

  1. NOT NULL -表示某列不能存储NULL值
  2. UNIQUE -保证某列的每行必须有唯一的值
  3. DEFAULT -规定没有给列赋值时的默认值
  4. PRIMARY KEY -NOT NULL 和 UNIQUE的结合,确保某列的数据不为空且唯一
  5. FOREIGN KEY -保证一个表中的数据匹配另一个表中的值的参照完整性

NOT NULL

在一个列中的数据不允许为空值。
以student表为例,在这个表中,Sno的NULL列表示YES,即允许Sno值为null
在这里插入图片描述
而以我们的日常生活经验来看,Sno是不允许为空的,因此我们需要为Sno加上约束Not Null 。

 create table student(Sno int not null,name varchar(20));

在这里插入图片描述
接下来对数据进行插入操作,我们可以看到只有当Sno 不为空时,才能插入成功;当将Sno = null 或不插入Sno 的数据,则数据库就会校验报错。
在这里插入图片描述

UNIQUE

使用unique,在该列的数据不允许出现重复的情况,通常用于学号、身份证号等信息。

create table student(Sno int not null unique,name varchar(20) unique);

我们可以查看表结构,观察可知Sno 设置为not null + unique => Primary key
name设置为unique
在这里插入图片描述
对表进行插入操作,只有满足所有的约束条件才能够插入数据,可以通过下面的SQL案例进行分析。
当选择了unique约束之后,每次插入/修改操作都会先对数据进行查询,如果发现不符合条件才会返回失败的结果。这从侧面可以看出效率会降低,但出错的概率就大大减小了。
在这里插入图片描述

DEFAULT

设置默认值。 当进行指定列插入操作时,未被指定的列就会保持默认值。
以下面的SQL语句为例,插入的数据如果没有指定名称,那么就默认name = ’无名氏‘

 create table student(id int not null unique,name varchar(20) default '无名氏');

在这里插入图片描述

PRIMARY KEY

主键 是一条数据的身份标识。主键是unique 和not null的结合体。
**一个表只能由一个主键,大多数情况主键使用的是整数形式,**但也可能会出现多个列的内容联合到一起构成的组件。

create table student(id int primary key , name varchar(20));

在这里插入图片描述

自增主键

为了解决主键不重复的问题,基于常用的以id作为主键的情况,MySQL提供了自增主键。顾名思义,在每次插入的数据中会在上一条数据的值+1.自增主键的关键字为auto_increment

 create table student(id int primary key auto_increment,name varchar(20));

当对主键采用自增形式之后,我们可以通过下图的SQL操作得到id在不指定时是自动增加的。即便在数据中没有数据,那么id就会自动从1开始

在这里插入图片描述
在这里插入图片描述
通过自增主键,我们就不需要每次都添加id的数据了,如果用户误操作将id值设置为null,MySQL也可以自动使用自增主键将它补上。当然,SQL也支持我们主动插入数据。
在这里插入图片描述

insert into student values(100,'lisi');

当我们插入id = 100的数据后,我们可以成功查询到数据,那么2-99的数据应该如何处理?在MySQL中是直接废弃掉的,从100之后开始继续自增。
在这里插入图片描述

FOREIGN KEY

外键的约束用于两张表之间的关联关系。为了能够连接两个表,外键要么是主键,要么是unique 在建立外键约束之后,后续对子表进行操作就会频繁涉及到两个表之间的操作。
以学生和班级之间的关系为例,在学生表中不仅有学号id,姓名name,同时还有关联着班级表的classId,而classId就是它的外键。同时还有班级表,里面有班级编号classId、班级名称className

//创建class表
create table class(classId int primary key auto_increment,className varchar(20));
//创建student表
create table student(id int primary key auto_increment,name varchar(20),classId int,foreign key(classId) references class(classId));

通过foreign key将student表中的classId与class表中的classId相关联。
原则上来说,在student表中插入的classId必须要在class表中存在。class表制约student表,而student表属于被制约的一方。因此他们之间也被成为父子表。
以下面的SQL语句我们可以看到,当class表中不存在id = 1 的数据时,MySQL将会报错。而当class表中存在对应的数据,则可以插入成功。
在这里插入图片描述
那么我们可以直接删除class表中的数据吗?
在下面的class表中,我们删除的classId = 100的数据是不被student表关联的,因此可以成功删除。
在这里插入图片描述
而在存在关联的classId = 1的数据中,我们是无法删除的。
在这里插入图片描述


总结

对表属性进行约束能够更好的对数据进行管理和区分,也提高了代码的准确性,提升了工作效率。

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

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

相关文章

数据结构----链表

一丶概念 链表又称单链表、链式存储结构,用于存储逻辑关系为“一对一”的数据。 和顺序表不同同,使用链表存储数据,不强制要求数据在内存中集中存储,各个元素可以分散存储在内存中。 二丶特点 特点:内存不连…

DolphinScheduler集群部署问题(趟坑)总结

目录 官方文档 官方项目地址 问题解决 官方文档 DolphinScheduler | 文档中心 (apache.org) 官方项目地址 部署及使用过程中的问题可以参见项目Issue:Issues apache/dolphinscheduler GitHub GitHub - apache/dolphinscheduler at 3.2.2-release 问题解决 1、JVM在运…

Simple RPC - 05 从零开始设计一个客户端(下)_ 依赖倒置和SPI

文章目录 Pre概述依赖倒置原则与解耦设计与实现1. 定义接口来隔离调用方与实现类2. 实现类DynamicStubFactory3. 调用方与实现类的解耦 依赖注入与SPI的解耦依赖注入SPI(Service Provider Interface) 总结 Pre Simple RPC - 01 框架原理及总体架构初探 …

网络编程:OSI协议,TCP/IP协议,IP地址,UDP编程

目录 国际网络通信协议标准: 1.OSI协议: 2.TCP/IP协议模型: 应用层 : 传输层: 网络层: IPV4协议 IP地址 IP地址的划分: 公有地址 私有地址 MA…

dotnet常用命令详解

命令预览 基础命令 new:创建项目 restore:恢复依赖 build:编译项目 publish:生成项目需要的文件准备发布项目 run:运行项目 test:测试项目 vstest:从指定的程序集中运行测试 pack&#…

升级阿里云linux服务器上的php版本

查看已安装的php软件包 [rootiZbp13pl2v34qj0thwq9aiZ ~]# rpm -qa|grep php php74-php-common-7.4.26-1.el7.remi.x86_64 oniguruma5php-6.9.7.1-1.el7.remi.x86_64 php74-php-gd-7.4.26-1.el7.remi.x86_64 php74-php-opcache-7.4.26-1.el7.remi.x86_64 php74-php-json-7.4.2…

记录|Git工具——下载GitHub项目

目录 前言一、Step 1. 下载Git二、Step2. 用Git Bash 下载到本地更新时间 前言 参考文章: 1、如何使用Git将Github项目拉到本地 2、git 安装、创建仓库、上传项目、克隆下载、常用命令 – 一篇文章总结(适用github / gitee) 3、Git的使用【入…

政策驱动,科技引领,漫途信息化监测方案守护农村饮水安全!

近日,山西省人民政府正式发布《山西省农村供水高质量发展规划》,明确到2030年,全面实现农村24小时供水,县域农村饮水安全标准化建设达标率力争达到80%,基本实现农村供水城市化、城乡供水均等化。 现阶段部分地区受…

ArcGIS简单介绍

ArcGIS体系结构 (1)GIS Server 宿主各种GIS资源,将他们封装为服务提供给客户端应用。GIS Server分为两部分:Server Object Manager(SOM)和Server Object Containers(SOCs)。一个SO…

Java语言程序设计——篇十三(4)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…

仪表板展示|DataEase看中国:2024巴黎奥运会中国体育代表团战绩报告

背景介绍 北京时间2024年8月12日凌晨,巴黎奥运会闭幕。在本届奥运会中,我们不仅见证了许多新世界纪录的诞生,更看到了中国体育的强大实力与无限潜力。中国运动健儿们卓越的表现和顽强的拼搏精神,不但让国人为之自豪,也…

Windows 11 Build 27686 上手体验:2TB FAT32、更好的沙盒等功能

Windows 11 Build 27686 现已在 Insider Program 的 Canary 频道发布,其中包含一些有趣的内容。该版本确认了微软更改 FAT32 大小限制的计划,并将其大小限制从 32GB 提高到 2TB。与此同时,沙盒也得到了改进。让我们来详细了解一下此次更新。 …

【卡码网Python基础课 16.出现频率最高的字母】

目录 题目描述与分析描述2.分析 一、哈希表二、代码编写 题目描述与分析 描述 题目描述: 给定一个只包含小写字母的字符串,统计字符串中每个字母出现的频率,并找出出现频率最高的字母,如果最高频率的字母有多个,输出…

Nginx--虚拟机配置

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 1、什么是虚拟主机 虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对…

字符串函数!!!(续)(C语言)

一. strtok函数的使用 继续上次的学习,今天我们来认识一个新的函数strtok,它的原型是char* strtok(char* str,const char* sep),sep参数指向了一个字符串,定义了用作分隔符的字符合集,第一个参数指定⼀个字符串&#…

基于C# winform部署图像动漫化AnimeGANv2部署onnx模型

【界面截图】 【效果演示】 【部分实现代码】 using System; using System.Diagnostics; using System.Windows.Forms; using OpenCvSharp;namespace FIRC {public partial class Form1 : Form{Mat src null;public Form1(){InitializeComponent();}private void button1_Cli…

消息系统-WebSocket消息推送

消息系统-WebSocket消息推送 接口层使用消息通知 1.数据库设计: 1.消息通知表 2.消息记录表 3.用户表和角色表及用户角色记录表 2.设计: 未使用消息中间件 ,利用接口层调用消息通知接口工具类 3.前端:消息通知页面 1.消息通知列表 2.消息通知标签 3.消息通知未读抽屉列表 一.…

Ubuntu离线安装库并解决依赖关系

(1)起因 安装插件出现库未找到的错误 configure: error: curses library is required but not found.(2)解决方法 手动到Ubuntu的库发布网页下载 http://packages.ubuntu.com/ 选择系统对应架构的版本下载,然后上传…

django(REST_FRAMEWORK)+swagger+Apifox 集成

1.reset_framework 1.1安装rest_framework 1.2使用rest_framework 在django框架中setting文件中注册rest_framework INSTALLED_APPS [rest_framework, ]2.reset_frameworkswagger 2.1.安装drf_yasg 2.2.在django框架中setting文件中注册drf_yasg INSTALLED_APPS [drf_…

滴滴开源新项目Unify:聚焦Flutter与原生通信难题,助力跨端应用落地

引言 在移动开发领域,移动跨端技术因其提效收益,逐渐成为业界趋势之一。Flutter 作为近年来热门的跨端技术,以高性能、自渲染、泛跨端著称,得到广泛应用。在滴滴国际化业务中,我们大量应用 Flutter。目前已在滴滴国际化…