MySQL - 第4节 - MySQL表的约束

news2024/11/17 14:41:41

1.MySQL表的约束概述

• 真正约束字段的是数据类型,如果插入的数据超出了对应数据类型的取值范围,那么数据将会插入失败。
• 但是数据类型的约束很单一,为了更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,MySQL中出现了表的约束,目的就是为了尽可能保证数据安全,减少用户的误操作可能性。
• 表的约束有很多,本篇博客主要介绍如下几个:null/not null、default、comment、zerofill、primary key、auto_increment、unique key、foreign key。


2.空属性

• 空属性有两个值,分别是null和not null。

• 数据库默认字段基本都是允许为空的,但在实际开发中我们要尽可能保证字段不为空,因为空值无法参与运算。

比如通过select可以看到null的值为null。如下:

由于空值无法参与运算,因此null值加一后得到的还是null。如下:

如果要让某个字段不允许为空,在创建表的时候就可以给对应字段设置not null属性。比如我们创建一个班级表,表当中包含班级名和该班级所在的教室,如果插入数据时不想让这两个字段为空,就可以在创建表时给这两个字段设置not null属性。如下:

创建表完毕后查看表结构,可以看到这两个字段是不允许为空的。如下:

向表中插入记录时只有这两个字段都不为空时才能插入成功,否则将会插入失败。如下:


3.默认值

• 如果某一个字段会经常性的出现某个值,那么就可以考虑将这个值设置成该字段的默认值。

• 向表中插入数据时如果不给带有默认值的字段赋值,那么就会使用默认值进行插入。

比如创建一个用户表,表当中包含用户的姓名、年龄和性别,将用户的年龄默认设置成0,将用户的性别默认设置成男。如下:

创建表完毕后查看表结构,可以看到默认值已经设置成功了。如下:

向表中插入数据时,如果不指明用户的年龄或性别,那么就会使用对应的默认值,如果指明了就会使用用户指定的值。如下:

同时设置not null和default:

• 一旦给某一字段设置了默认值,那么该字段将不会出现空值,因为就算插入数据时没有指明该字段的值,也会使用该字段的默认值进行填充。
• 而给某一字段设置not null属性的目的是约束该字段不能为空,因此一个字段设置了default属性后,再设置not null属性似乎就没有意义了,但其实是有意义的,not null属性可以防止我们显式的直接插入null,二者是相互补充的。

• 给某一字段同时设置了not null和默认值,此时如果插入数据时强行指明该字段为null,则依然会报错,如果不强行指明该字段则该字段为默认值,如果强行指明该字段为某值则该字段为对应值。
创建一个id表,表当中包括姓名和id,将id同时设置default和not null属性。如下:

创建表完毕后查看表结构,可以看到id字段是不允许为空的,并且其默认值是1。如下:

此时在向表中插入数据时可以不指明id进行插入,此时会使用id的默认值。如下:


4.列描述

• 列描述是在创建表的时候用来对各个字段进行描述的,列描述会根据表创建语句保存,一般是用来给程序员或DBA了解表的相关信息的,相当于一种注释。

比如创建一个用户表,表当中包含用户名、用户的年龄和用户的性别,在每一个字段后面添加上对应的列描述。如下:

创建表完毕后,通过 show create table 表名 命令可以看到创建表时的相关细节,包括列描述。如下:


5.zerofill

• 数值类型后面的圆括号中的数字,代表的是显示宽度,对应数值类型设置zerofill属性后,如果数据的宽度小于设定的宽度则自动填充0。

比如创建一个表,表当中包含a和b两列整型数据,将它们的显示宽度都设置成5,但是没有设置zerofill属性。如下:

向表中插入一条记录,指明a和b的值均为1,由于我们没有给a和b字段设置zerofill属性,因此查看表中数据时显示出来的都是1,并没有显示宽度的概念。如下:

修改表结构,给a列添加上zerofill属性,由于a列数据的显示宽度为5,因此查看表中数据可以看到a列数据中宽度不足5位的数据都自动在前面填充0了。如下:

需要注意的是,zerofill属性的作用就是让数据以特定的方式进行显示而已,数据底层的储存方式并没有发生变化,通过hex函数可以看到a列中显示的00001在底层实际储存的还是1。如下:

注:如果建表时创建int类型变量时没有圆括号指明int的大小,那么mysql会自动指明,有符号int会自动指明大小为11,无符号int会自动指明大小为10,如下图所示。

一个整数对应32个比特位,如果是无符号的整数,那么其取值范围0到2^{32}-12^{32}-1为42亿多,无符号整数默认10位是因为刚好可以将这42亿多的数值全部显示出来,而有符号整数还多了一个符号位,所以有符号整数默认11位。

 


6.主键

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ldr、str、ldm、stm、msr、mrs、swi、svc、mrc等ARM指令详解及具体应用

文章目录 前言一、跳转指令1.1 相对跳转1.2 绝对跳转 二、内存操作指令2.1 Load和Store2.1.1 伪指令2.1.2 伪操作 2.2 内存操作指令具体应用 三、 寄存器的寻址方式3.1 前索引寻址3.2 后索引寻址3.3 基址变址 四、块拷贝指令(多数据加载)4.1 块拷贝4.2 指…

Nacos 源码分析全系列

Nacos 源码分析全系列 学习目标 主线任务 代码解析画图git库(中文注释)设计思想多版本迭代讨论群(私聊进群) 主要的大纲路线 主要拆解的是nacos的1.4.1版本和2.1.0版本,还有nacos 的一些已知的bug 正确的学习源码的姿势 服务端是如何处理客户度的请求 注册中心服务 内存…

【备战秋招】每日一题:华东师范大学保研机试-2022-差分计数

为了更好的阅读体检,可以查看我的算法学习博客差分计数 题目内容 给定n个整数,...,和一个整数x。求有多少有序对(i,j)满足 输入格式 第一行两个整数,分别代表整数的个数和题目中的x。 第二行n个用空格隔开的整数,第i个代表 输出格式 一行一个整数…

1745_Perl中的switch结构

全部学习汇总: GreyZhang/perl_basic: some perl basic learning notes. (github.com) 用了很久时间的Perl了,但是一直没有使用过switch结构。即使有的时候,基本上也通过其他的形式完成了相关工作。虽说有时候可能会效率低一些,但…

【Python】使用pyside2时qt designer 设计窗口显示图标icon但是运行后不显示(图文说明)

目录 错误情况解决方法总结 欢迎关注 『Python』 系列,持续更新中 欢迎关注 『Python』 系列,持续更新中 平时用的不多,也不知道这个报错有没有偶然性,或者是我自己搞错了仅供参考。 错误情况 toolBar中的图标在designer中显示正…

【备战秋招】每日一题:华东师范大学保研机试-2022-位运算

为了更好的阅读体检,可以查看我的算法学习博客位运算 题目内容 给定一个int型整数x,将x的二进制表示中第i位和第j位的值互换。 注意: x的二进制表示的最右边为第0位。 输入格式 在一行中输入三个整数,x,i,j, 整数之间用一个空格分隔。 输出格式 在…

【开启微前端新时代】微前端:构建可扩展、可维护的现代 Web 应用

文章目录 第1章:微前端简介微前端是什么微前端的优势和劣势微前端有以下优势1. 独立部署2. 技术栈无关3. 更好的扩展性4. 短生命周期 微前端的劣势:1. 系统复杂度2. 通信机制3. 部署成本 微前端的历史和现状 第2章:微前端架构模式容器和子应用…

软考A计划-网络工程师-系统架构师案例分析知识点整理

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Linux串口编程

文章目录 前言一、Linux下的TTY体系介绍二、行规层三、Linux串口编程步骤四、代码编写总结 前言 本篇文章将讲解如何在Linux下使用串口。 一、Linux下的TTY体系介绍 在Linux系统中,tty(Teletypewriter)是指一种终端设备,它提供…

Fiddler之Replay功能详解

今天就先来看看Fiddler的功能。 Fiddler,最容易看到的就是快捷工具栏中的 Replay 按钮 解释下: Reissue the selected requests. 重发选中的请求Hold CTRL to reissue unconditionallly. 选中请求按住 CTRL 键,点击Replay时无条件重发选中…

【MySQL函数】:让你的数据库操作更高效(一)

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL字符串函数和数学函数的讲解✨ 目录 前言一、字符串函数二、数学函数三、总结 一、字符串函数 函数作用UPPER(列|字符串)将字符串每个字符转为大写LOWER(列|字符串)将字符串每个字符转为小写CONCAT(str1,str2,…

CSS的学习2

这几天复习了英语,高数,也考完四级了。 这两天开始写了课设的项目,选的是捷住宝,我打算用链表和搜索树。写着写着总是出问题,然后改Bug。还差删除信息和文件操作,还是尽量写好一些。 明天考英语&#xff…

TX-1C单片机实现多功能电子时钟

实验报告 电子时钟实验 一、实验要求:二、实验结果三、实验思路(一)模块整理(二)流程图绘制(三)C51编程 四、实验总结(一)未完成的部分(二)待优化…

layui框架实战案例(22):多附件上传实战开发实录(php后端、文件删除、数据库删除)

layUI框架实战案例系列文章 layui框架实战案例(21):layui上传的哪些事(layui.upload组件、 file文件域、php后台上传)layui框架实战案例(20):常用条件判断和信息展示技巧(图片预览、动态表格、短信已读未读、链接分享、信息脱敏、内置框架页)layui框架实…

【Spring Cloud系列】-Eureka服务端高可用详解

【Spring Cloud系列】-Eureka服务端高可用详解 文章目录 【Spring Cloud系列】-Eureka服务端高可用详解一. 序言二. 什么是高可用性三. 什么是CAP一致性(Consistency)可用性(Availability)分区容错(Partition-toleranc…

2.8 基于DPDK的UDP用户态协议栈实现

目录 一、网络协议栈1、**网络通信过程**2、**dpdk** 二、dpdk环境1、dpdk环境开启2、Windowe下配置IP和MAC地址的映射 三、实现用户态协议栈ustack1、UDP协议2、代码 四、dpdk一些基本函数接口rte_eal_init()rte_pktmbuf_pool_create()rte_socket_id()rte_eth_dev_configure()…

Java连接MySQL对数据实现增删改查

在实现好的窗口实现 添加修改删除查询数据的方法 以如下数据实验 statement自带的函数使用说明execute (SQL)执行给定的SQL语句返回一个或多个结果结果集 execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组…

Verilog | 基4 booth乘法器

上接乘法器介绍 原理 跟基2的算法一样,假设A和B是乘数和被乘数,且有: A ( a 2 n 1 a 2 n ) a 2 n − 1 a 2 n − 2 … a 1 a 0 ( a − 1 ) B b 2 n − 1 b 2 n − 2 … b 1 b 0 \begin{align}A&(a_{2n1}a_{2n})a_{2n−1}a_{2n−2}……

安卓期末考试知识总结(3)

文章目录 第五章 数据存储文件存储(非重点)内部存储获取或者打开目录操作文件 外部存储区 SharedPreferences存储写入Shared Preferences读取数据 SQLite数据库SQLite数据库的创建操作数据库数据Curosr数据库的事务 第五章 数据存储 简述Android数据存储的方式 Android平台提供…

FreeRTOS:任务通知

目录 一、任务通知简介二、发送任务通知2.1 函数xTaskNotify()2.2函数xTaskNotifyFromISR()2.3函数xTaskNotifyGive()2.4函数vTaskNotifyGiveFromISR()2.5函数xTaskNotifyAndQuery()2.6函数xTaskNotifyAndQueryFromISR() 三、获取任务通知3.1函数ulTaskNotifyTake()3.2函数xTas…