当前位置: 首页 > 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接口存在任意文件读取漏洞,未经身份验证攻击者可通过该漏洞读取…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...