MySQL中表的约束

server/2024/12/22 21:44:04/

1,概念

表中一定要有各种约束,通过约束,让我们来插入数据库中的数据是符合预期的。

约束本质是通过技术手段,倒逼程序员插入正确的数据;反过来,站在MySQL的角度来单,内部已经插进来的数据,都i是符合数据约束的数据。

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

为了完成以上的所有目标,就需要除了数据类型自带的范围约束以外的更多约束。

2,空属性

在MySQL里,null表示没有而不是0,' '代表空串。

两个值:null(默认的)和not null(不为空)

数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办 法参与运算。

操作:在创建表后面加上not null;

 可以看到,在创建元素的时候加了 not null,在查看表的时候Null列里就会显示NO。

那么插入操作:

                   

可以看到,insert里不对加了空约束的值插入数据时系统会报错,当然可以插入空串;还有一个操作也无法插入数据:

3,默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值。

例子:

可以看到,表中default这一列出现了值,接下来我们插入几个值测试一下:

可以看到,在我们不输入值的时候就会默认给我们输入缺省,在用户输入元素的时候,就会选择用户输入的元素插入。

可以看到,我给age设置了not null 和 default:

可以看到,就算加了not null 没对age指定插入时不会报错,且使用的时缺省值,但是指定对age插入空的话就会报错。

在我们日常使用中,not null和default是互相补充的。

not null 和 default 一般不需要同时出现,以为default本身默认值不会为空。

4,列描述

操作:comment + 内容

没有实际含义,更类似于我们平时写代码的注释:

5,zerofill

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。通过show看看text14表的建表语句:

可以看到int(11),这个代表什么意思呢?整型不是4字节码?这个11又代表什么呢?其实没有zerofill这个 属性,括号内的数字是毫无意义的。age和id列就是前面插入的数据,如下:

那么我们稍微改一下id的属性,在后面加上zerofill:

可以看到,在id加了zerofill的约束之后,在100前面会补零,其总位数就是11位,正好对上

int(11)的括号里的值,那么改完属性之后里面的100的值会不会发生改变?

可以用where查到,值是不会发生改变的。

那么zerofill的作用在哪里?

可以在固定的长度中让表的宽度保持一直以维持美观,当然如果插入的位数大于zerofill定义的位数,也可以成功插入,但是超过的位数会有图出:

6,主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个 主键;主键所在的列通常是整数类型

那么我们来插入数据测试一下:

可以看到,当我们插入重复的数据的时候,系统会拦截不给我们插入:

可以看到,也不能往里面插入空值.

那么如何去掉主键?

以为整个表里就一个主键,所以直接指明要删主键系统自动就会帮我们删除。

在删除了主键之后,我们就可对其进行插入重复值的操作:

那么如何插入主键?

可以看到,我们要把表内重复的数据和null清理了才可以插入主键。

7,复合主键

我们知道,一个表中主键只有一个,但是不意味着一个表的主键只能添加一列,这种多列主键的操作叫做复合主键。

操作:

可以看到key位置的id和course位置都有pri,现在我们对他插入测试:

这就是复合主键的使用方法。

8,主键子问题:自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

可以看到,id在我们不插入值时他会固定增长,要是插入的值和表中id相同则会报错。

我们可以指定某个数字开始加一:

也可以在创建表时,在表的结尾写:auto_increment = 500来改想要的id起始值:

9,唯一键(可以为空)

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以 解决表中有多个字段需要唯一性约束的问题,除了可以为空,其他操作和主键相同,如果想让值不为空,可以加not null。

关键字:unique

那么我们来插入一下数值看看:

可以看到,插入的id不能重复,但是可以为空。

主键选择了某个元素为主键,这时如果其他值也有唯一性的时候,可以用唯一键来补充,唯一键与主键并不冲突,他们是相互补充的。

例如个人id和telphone(电话),都是唯一的。

10,外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

语法:foreign key (字段名) references 主表(列)

我们在进行复杂的表管理时,难免不了经常有表与表之间有精密的联系,这个时候我们可以用外键来相互对两张表进行相互约束:

接下来看案例:

我们可以看到,表与表之间存在某种关联,主表是calss,从表是student,这时我们可以使用外键命令来约束,一般外键写在从表:

那么我们来插入数据测试一下:

可以看到,在符合主表的条件下可以插入,但是不符合主表约束条件的不给插入

如果从表有数据,那么主表的相关的数据不能被删掉:

希望对你们有帮助。


http://www.ppmy.cn/server/132177.html

相关文章

Redis学习笔记:压缩列表

概述 压缩列表(ziplist)本质上就是一个字节数组,是Redis为了节约内存而设计的一种线性数据结构,可以包含多个元素,每个元素可以是一个字节数组或一个整数。压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项&#xff0…

神经网络反向传播交叉熵 计算损失函数对输出层偏置b2的梯度

本文是交叉熵损失函数为代表的两层神经网络的反向传播量化求导计算公式中的一个公式,单独拿出来做一下解释说明。 公式 8-15 是反向传播算法中,计算损失函数对输出层偏置 b 2 b_2 b2​ 的梯度。这个梯度用于指导偏置的更新,从而最小化损失函…

尚硅谷rabbitmq2024 集群篇仲裁队列 第52节 答疑

我们希望创建一个队列,队列分布在各个节点上,仲裁队列很好的解决了这个问题.那么在仲裁队列之前,创建一个队列,队列不是分布在各个节点上的吗? 在RabbitMQ中,默认情况下创建的队列是“普通队列”&#xff0…

【Linux】ioctl分析

简介 一个字符设备驱动通常会实现常规的open、release、read和write接口,但是如果需要扩展新的功能,通常以ioctl接口的方式实现。 #mermaid-svg-uY8EyPklf5e4ZMQo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…

简单实现手机、电脑相互操作

1、从手机截图到sdcard 2、将图片导出到PC 3、从PC加载图片 4、开启定时器 5、操作电脑UI事件 1、 private static void takeScreenshot(String path) {long t1 System.currentTimeMillis();String command "adb devices"; // 替换为你需要执行的shell命令Str…

C#中判断的应用说明二(switch语句)

一.判断的定义说明 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。下面是大多数编程语言中典型的判断结构的一般形式: 二.判…

百度下拉框出词技术解密:72小时出下拉词软件原理分享

如何才能刷下拉词?这个问题一直是企业做流量时最纠结的问题,百度下拉词作为百度搜索体验中的一项智能化功能,极大地方便了用户快速完成搜索,也成为了企业在搜索引擎优化(SEO)策略中的重要流量入口。通过研究…

int QSqlQuery::size() const

返回结果的大小(返回的行数) 或者返回-1 (如果大小不能被决定 或者 数据库不支持报告查询的大小信息) 注意:对于非查询语句,将返回-1(isSelect()返回false) 如果查询不是活跃的&…