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

【MySQL】数据库必备知识:全面整合表的约束与深度解析

        前言:本节内容讲述表的约束的相关内容。 表的约束博主将会通过两篇文章进行讲解, 这是第一篇上半部分。 讲到了约束概念。 以及几种常见约束。下面友友们开始学习吧!

        ps:友友们使用了mysql就可以放心观看喽!

目录

表的约束概念

非空约束

 default默认值

default

非空和默认的区别   

列描述

zerofill

主键

去掉主键       

建表后添加主键

多列主键


表的约束概念

        表的约束要让用户在数据库当中安全的插入数据, 就必须要有表的约束。 否则就比如我们的这个表的这一行信息应该插入性别, 但是有没有用户在上层插入了一个人名呢? ——所以, 为了避免这些问题。表中就要有各种约束, 通过约束, 让我们未来插入数据库表中的数据是符合预期的。 

        约束本质是通过技术手段倒逼程序员插入正确的数据。反过来站在mysql的角度, 凡是插入进来的数据都是符合数据约束的。

        约束的最终目标就是保证数据的完整性和可预期性。 

        综上, 所以为了能够更好的使用数据库, 我们就需要更多的约束条件

非空约束

        NULL VS '  '这两个有什么区别呢? 其中'   '并不是什么都没有, 而是表示插入的是一个空串, 是一个字符串, 只不过这个字符串是空的。 而NULL是什么都没有。 (NULL是不参与运算的。)

        非空约束有两个:一个是null(默认的为空) 和 not null(不为空)。什么意思, 就是说我们建表的时候,如果不带null和not null。 那么默认的就是null, 也就是该列属性可以为空。 而如果我们想要让该列属性不能为空, 就必须添加一个not null。 

        下面为例子:

create table if not exists class(class_name varchar(20) not null,
class_room varchar(20) not null,
other varchar(20) 
);

        desc后的显示结果中有一列: Null,下面有的是NO, 有的是YES。  这里的NO就是不允许为空。 如果插入空, 那么就报错:

insert into class values(null, 103, 104);
insert into class values(103, null, 104);
insert into class values(103, 103, 104);

 default默认值

default

        default是默认值, 就比如说我们在插入数据的时候, 有可能某一列没有插入数据, 那么这个时候如果有默认值, 这个列就能自动的插入一个默认值。

        下面为示例:

mysql> create table if not exists t13(-> name varchar(20) not null,-> age tinyint unsigned default 18,-> gender char(1) default '男'-> );

        然后我们就能看到上面的我们没有设置not null的就是默认可以为空。 然后后面有一个Default, 这个Default默认是NULL, 空没有默认值。 然后我们设置后, 就出现了默认值18或者男。

       只插入name, 然后age和gender都被插入了默认值。  

非空和默认的区别   

    接下来测试非空和默认的区别:

mysql> create table if not exists t14(-> name varchar(20) not null,-> age tinyint default 18,-> gender char(1) not null default '男'-> );

我们先测试name:

        这里我们首先插入了一个NULL,给我们报错是不能为空。 这符合我们的语气,因为NULL就是代表空。 而name不能为空, 所以会报错。

        问题是第二个报错。 我们对name列没有进行插入, 但是他报错了没有默认值。 ——所以, 这里就有一个结论: 如果我们某一列设置了not null, 那么我们没有明确指定一列要插入, 用的就是default,如果建表中对应列默认没有设置default, 无法直接插入。

        gender既有not null, 又有default, 所以按照刚刚的结论就应该可以插入:

        可以观察到插入成功。

        所以default 和 NOT NULL不冲突, 而是互相补充的。当用户想插入的时候, 就是NULL和NOT NULL来约束(插入NULL 、合法数据、不合法数据) ;当用户忽略这一列的时候, 就是使用default来约束:如果设置了就是使用默认值。 如果没有设置, 那么就会报错!!!。

        但是, 我们之前插入的时候, 明明是可以忽略某一列的啊, 就比如下面这样:

        我们创建一个表, 这个表当中三列, 都没有设置默认值。 但是我们也可以忽略gender这一列啊。 这是为什么呢? 是不是上面我们的结论出错了呢? ——答案是不是的。 这是因为mysql在我们创建表的时候做了优化, 如果我们不带默认值, 他就会默认给我们添加默认值NULL:

列描述

        列描述就相当于对表当中的字段进行说明。就是一种描述字段。并没有说如果不符合规则就不让插入。 

mysql> create table if not exists t16(-> name varchar(20) not null comment'这个是用户的用户名',-> age tinyint unsigned default 18 comment '这个是用户的年龄',-> gender char(1) not null default '男' comment '这个是用户的性别'-> );

zerofill

        zerofill其实就是将数据的所有位全部用0填充,格式化显示。就是如果插入的数据的宽度小于限定的宽度, 那么就补零。如果超出了宽度, 那么就要原本的数据位数。 

        下面为示例:

create table t18( a int unsigned zerofill, b int unsigned );

        上面可以看到我们使用zerofile创建的a变量, int类型是申请了10个空间。 然后我们插入一些数据:

然后我们就能看到, a这里除了一个1, 前面的位都被0填满了。 

主键

        主键约束就是我们在建表的时候, 有一列信息标定该一条信息的唯一性,并且这一列信息不能为空。也就是主键列不能重复, 不能为空。 一张表中最多只能有一个主键。主键所在的列通常是整型类型。

         下面为示例:

mysql> create table if not exists test_key(-> id int unsigned primary key comment '这个是学生的学号',-> name varchar(20) not null,-> gender char(1) -> );


        通过上面的例子我们观察, 其中我们的id是一个主键列, 这个id的Key的位置被设置成为了PRI,意思就是主键列。 然后Null变成了不能为空。 这个是主键列的性质。

        插入的时候我们的id重复, 就会报错!!

去掉主键       

alter table 表名 drop primary key;

然后就能重复插入了:

建表后添加主键

alter table 表名称 add primary key(id);

 我们上面添加失败是因为id列有许多重复的元素。 所以我们想要添加主键就要将去重:

我们去重之后就能插入了。

多列主键

        一个主键可以被添加到一列或者多列, 这类多列主键叫做符合主键。

        下面为示例:

mysql> create table t19(-> id int unsigned,-> course_id int unsigned comment'课程编号',-> score tinyint unsigned comment'这个学生这门课程的分数',-> primary key (id, course_id)-> );


        我们创建好了之后, id和course_id合起来才称为一个主键。 下面我们测试插入数据:

insert into t19 values(1234, 40, 90);
insert into t19 values(1235, 40, 90);
insert into t19 values(1235, 41, 90);
insert into t19 values(1235, 40, 90);

        然后我们就能发现我们重复可以让1234选择40这门课, 1235也可以选择40这门课。 1235也可以选择41这门课。 但是1235再次选择40这门课的时候就出错了!

        所以, 多列主键就是, 列之中只要有一个数据不一样, 就可以进行插入。只有当所有数据都一样的时候才不可以插入。

  ——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!    

相关文章:

【MySQL】数据库必备知识:全面整合表的约束与深度解析

前言:本节内容讲述表的约束的相关内容。 表的约束博主将会通过两篇文章进行讲解, 这是第一篇上半部分。 讲到了约束概念。 以及几种常见约束。下面友友们开始学习吧! ps:友友们使用了mysql就可以放心观看喽! 目录 表的约束概念 …...

Windows下Docker快速安装使用教程

在当今软件开发和部署的世界中,Docker 已经成为一个不可或缺的工具。这里不对Docker进行详细阐述,需要系统学习Docker的伙伴可寻求更专业详细的教程或书籍学习。本文主要讲解Windows系统下Docker安装及使用。 一、环境准备 1.1检查电脑是否开启虚拟化 …...

PTA DS 6-2 另类堆栈 (C补全函数)

6-2 另类堆栈 分数 15 全屏浏览 切换布局 作者 DS课程组 单位 浙江大学 在栈的顺序存储实现中,另有一种方法是将Top定义为栈顶的上一个位置。请编写程序实现这种定义下堆栈的入栈、出栈操作。如何判断堆栈为空或者满? 函数接口定义: …...

rk3568之mpp开发笔记mpp移植到开发板

前言: 大家好,今天给大家介绍的内容是rk平台的mpp编解码这块的内容,在rk目前看到有三套框架涉及到编解码内容: 1、rkmedia 2、rockit 3、mpp 这三种不同形式的编解码方式,后面再做详细的框架对比,今天我…...

Vue解决跨域问题

要解决 Vue 项目的跨域问题并通过 vue.config.js 配置代理,可以按照以下步骤修改 vue.config.js 文件。你提供的代码大部分已经正确,只需要做一些格式上的调整。以下是正确的 vue.config.js 配置: // vue.config.jsmodule.exports {devServ…...

Kubernetes Nginx-Ingress | 禁用HSTS/禁止重定向到https

目录 前言禁用HSTS禁止重定向到https关闭 HSTS 和设置 ssl-redirect 为 false 的区别 前言 客户请求经过ingress到服务后,默认加上了strict-transport-security,导致客户服务跨域请求失败,具体Response Headers信息如下; 分析 n…...

TortoiseGit的下载、安装和配置

一、TortoiseGit的简介 tortoiseGit是一个开放的git版本控制系统的源客户端,支持Winxp/vista/win7.该软件功能和git一样 不同的是:git是命令行操作模式,tortoiseGit界面化操作模式,不用记git相关命令就可以直接操作,读…...

如何绕过IP禁令

网站、游戏和应用程序可以屏蔽特定IP地址,从而阻止使用该IP地址的任何人访问其服务。这称为IP禁令。管理员可以出于多种原因(例如发出过多请求或可疑活动)屏蔽IP地址。但是,这些禁令会使收集数据或访问在线内容变得更加困难。 一…...

Vue3的provide和inject实现多级传递的原理

先来看个demo&#xff0c;这个是父组件&#xff0c;代码如下&#xff1a; <template><ChildDemo /> </template><script setup> import ChildDemo from "./child.vue"; import { ref, provide } from "vue"; // 提供响应式的值 c…...

使用html2canvas实现前端截图

一、主要功能 网页截图&#xff1a;html2canvas通过读取DOM结构和元素的CSS样式&#xff0c;在客户端生成图像&#xff0c;不依赖于服务端的渲染。它可以将指定的DOM元素渲染为画布&#xff08;canvas&#xff09;&#xff0c;并生成图像。多种输出格式&#xff1a;生成的图像…...

使用 Python 爬取某网站简历模板(bs4/lxml+协程)

使用 Python 爬取站长素材简历模板 简介 在本教程中&#xff0c;我们将学习如何使用 Python 来爬取站长素材网站上的简历模板。我们将使用requests和BeautifulSoup库来发送 HTTP 请求和解析 HTML 页面。本教程将分为两个部分&#xff1a;第一部分是使用BeautifulSoup的方法&am…...

深度学习模型中音频流式处理

音频流式处理的介绍 在现代深度学习应用中&#xff0c;音频处理是一个重要的领域&#xff0c;尤其是在语音识别、音乐生成和音频分类等任务中。流式处理&#xff08;Streaming Processing&#xff09;是一种有效的处理方式&#xff0c;它允许模型逐帧处理音频数据&#xff0c;…...

C语言(字符数组和字符指针)

字符串实现 在C语言中&#xff0c;表示一个字符串有以下两种形式&#xff1a; 用字符数组存放一个字符串。用字符指针指向一个字符串。 案例 #include <stdio.h>/*** 方式1&#xff1a;使用字符数组实现字符串*/ void str_test1(){// 定义一个伪字符串char str[] &q…...

SkyWalking Helm Chart 4.7.0 安装、配置

https://skywalking.apache.org/events/release-apache-skywalking-kubernetes-helm-chart-4.7.0/https://github.com/apache/skywalking-helm/tree/v4.7.0https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/简介 skywalking 是分布式系统的 APM(Applicat…...

微搭低代码AI组件单词消消乐从0到1实践

目录 1 为什么要开发单词消消乐2 需要具备什么功能3 采用什么技术方案实现4 逻辑设计4.1 数据结构设计4.2 游戏的核心逻辑4.3 数据设计 5 代码详解5.1 导入依赖5.2 定义函数组件5.3 数据初始化5.4 状态定义5.5 打乱解释的逻辑5.6 定义选择单词的函数5.7 定义选择解释的函数5.8 …...

23种设计模式之中介者模式

目录 1. 简介2. 代码2.1 Mediator &#xff08;中介者接口&#xff09;2.2 ChatRoom &#xff08;具体中介者类&#xff09;2.3 User &#xff08;同事接口&#xff09;2.4 ChatUser &#xff08;具体同事类&#xff09;2.5 Test &#xff08;测试&#xff09;2.6 运行结果 3. …...

【Golang】Go语言编程思想(六):Channel,第六节,并发编程模式

并发模式 下例重新对 channel 的用法进行回顾&#xff1a; package mainimport ("fmt""math/rand""time" )func msgGen(name string) chan string {c : make(chan string)go func(name string) { // 在这个 goroutine 当中向外发送数据i : 0fo…...

unity打包web,如何减小文件体积,特别是 Build.wasm.gz

unity打包WebGL&#xff0c;使用的是wasw&#xff0c;最终生成的Build.wasm.gz体积很大&#xff0c;有6.5M&#xff0c;有几个方法可以稍微减小这个文件的大小 1. 裁剪引擎代码&#xff1a; 此步可将大小从6.5减小到 6.2&#xff08;此项默认开启&#xff0c;只是改了裁剪等级…...

go引入skywalking

前置条件&#xff1a;安装好jdk11&#xff0c;linux服务器&#xff08;centos7.9&#xff09;&#xff0c;go版本&#xff08;我的是1.18&#xff0c;1.21都可以&#xff09; 1.下载skywalking Downloads | Apache SkyWalking 2.下载agent源码 Downloads | Apache SkyWalkin…...

大华DSS数字监控系统 attachment_downloadAtt.action 任意文件下载漏洞复现

0x01 产品描述: 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。0x02 漏洞描述: 大华DSS数字监控系统 attachment_downloadAtt.action接口存在任意文件读取漏洞,未经身份验证攻击者可通过该漏洞读取…...

Taotoken用量看板如何帮助开发者洞察API消费明细

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken用量看板如何帮助开发者洞察API消费明细 对于依赖大模型API进行开发的团队或个人而言&#xff0c;清晰、透明地掌握资源消…...

Ubuntu 20.04上virt-manager报GDBus错误?别慌,三步排查法搞定它

Ubuntu 20.04 virt-manager报GDBus错误的深度排查指南 当你正准备用virt-manager管理KVM虚拟机时&#xff0c;突然弹出一个令人困惑的GDBus错误——这种场景对于Linux虚拟化用户来说并不陌生。这个看似简单的错误背后&#xff0c;其实涉及Linux桌面环境中多个关键组件的协同工作…...

终极指南:如何用UniversalSplitScreen在一台电脑上玩多人游戏

终极指南&#xff1a;如何用UniversalSplitScreen在一台电脑上玩多人游戏 【免费下载链接】UniversalSplitScreen Split screen multiplayer for any game with multiple keyboards, mice and controllers. 项目地址: https://gitcode.com/gh_mirrors/un/UniversalSplitScree…...

3分钟终极解决方案:Windows系统完美识别iPhone USB网络共享的完整免费指南

3分钟终极解决方案&#xff1a;Windows系统完美识别iPhone USB网络共享的完整免费指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https:/…...

如何用AEUX免费实现设计到动画的无缝转换:完整指南

如何用AEUX免费实现设计到动画的无缝转换&#xff1a;完整指南 【免费下载链接】AEUX Editable After Effects layers from Sketch artboards 项目地址: https://gitcode.com/gh_mirrors/ae/AEUX AEUX是一款免费开源的动效设计工具&#xff0c;它能让你从Figma或Sketch直…...

基于RAG与本地LLM的智能代码库管理工具部署与优化指南

1. 项目概述&#xff1a;一个为开发者打造的智能代码库管理工具最近在整理自己过去几年的项目代码时&#xff0c;我遇到了一个几乎所有开发者都会头疼的问题&#xff1a;代码库越来越多&#xff0c;但想快速找到某个特定功能的实现、或者想复用一段之前写过的优质代码时&#x…...

tabtoy性能优化秘籍:多核并发导出与缓存加速技巧

tabtoy性能优化秘籍&#xff1a;多核并发导出与缓存加速技巧 【免费下载链接】tabtoy 高性能表格数据导出器 项目地址: https://gitcode.com/gh_mirrors/ta/tabtoy 在处理大量表格数据导出时&#xff0c;性能往往是开发者面临的主要挑战。tabtoy作为一款高性能表格数据导…...

基于Java开发无人机飞手接单平台低空经济服务系统源码搭建

在低空经济快速崛起的当下&#xff0c;无人机已广泛应用于航拍、测绘、电力巡检、农业植保等多个领域&#xff0c;专业飞手资源与市场需求之间的对接难题日益凸显——需求方难以快速找到符合资质的飞手&#xff0c;具备合法资质的飞手也面临接单渠道分散、任务匹配低效的问题。…...

NotebookLM心理学研究辅助:为什么92%的心理学博士生漏用了“语义锚定”功能?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM心理学研究辅助 NotebookLM 是 Google 推出的基于用户上传文档进行深度语义理解的 AI 助手&#xff0c;其“以你的资料为中心”的设计范式特别契合心理学研究中对原始文献、访谈转录稿、实验…...

安卓android无法创建文件夹权限-幽冥大陆(一百21)-东方仙盟

谷歌从安卓 6 开始强制规定直接锁死&#xff1a;根目录 /、system、storage 根目录 全部禁止 APP 写入。目的&#xff1a;防流氓软件乱改系统、乱建文件夹、乱篡改系统文件。瑞芯微等主板厂商二次加锁RK、全志、晶晨这类工控主板&#xff0c;还额外加了两层限制&#xff1a;分区…...