【MySQL】表的约束

文章目录

表的约束

什么是表的约束

表的约束(Constraints)是数据库表中的规则,用于限制存储的数据,保证数据的完整性、一致性和准确性。

下面我们讲讲具体的表的约束

空属性

  • 两个值:null(默认的)和not null(不为空)
  • 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。

我们先默认创建一张表:

可以看见,当我们不指定约束条件的时候,创建表时默认会给Null约束条件添加上Yes,表示这里可以插入null。我们来试试。

插入数据:

我们重新创建一张设置为not null。

当表的这个属性被设置为No时,就表示不能插入Null了。

默认值

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

拿我们刚刚创建的表为例:

这个约束就是默认值,如果设置了默认值,当我们插入的时候忽略这一项时,就会拿默认值当中的数据进行填充。

我们来设置一下默认值,一数据没有默认值,一个数据有默认值。

设置默认值只需要在建表的时候在后面加上default即可,我们来插入数据:

可以看见这里虽然没有设置默认值,但是默认值被默认设置为了Null,因为我们没有设置not null,所以是会默认填入null的。

当将null约束设置为not null的时候就就不能忽略了。

列描述(comment)

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA

来进行了解。

列描述就类似于在我们写代码时的注释。

这就是列描述,用来描述这一列是用来干嘛的。

零填充(zerofill)

在 MySQL 中,ZEROFILL 是一种数值列的格式化属性,用于自动在数值前补零,使其达到指定的宽度。

我们创建一张表,不加任何约束是这样的,当我们加上zerofill之后:

可以看见,修改完zerofill约束条件之后,int后面多了一个10,后面多了一个zerofill,为什么10后面讲,我们先讲这个zerofill属性添加之后有什么影响:

可以看见,添加了zerofill属性的列前面多出了很多个0,这是为什么呢,我们加上前面的0,一共有10为数,所以这个10,就是位数,当我们插入一个数的时候,如果这个数的位数小于int后面的数,那么我们会在前面自动补上0,如果这数的位数是大于int后面括号中的数时,是多少就是多少。

主键

**主键(Primary Key)**是关系数据库中用于唯一标识表中每一行记录的一个或多个字段的组合。

可能很多人看到这句话之后也不是很理解什么是主键,那么我们创建一张表,来解释一下什么是主键:

当我们创建表的时候,只需要在后面加上primary key,就表示这一列是主键,我们来插入一点数据,来具体看看主键是什么:

我们设置的id是主键,当我们插入第一组值的时候,id是1,当我们插入第二组值的时候id也是1,MySQL就不让我插入了,但是当我们插入的值是2的时候,MySQL又让我们插入了。

所以,被设为主键的列当中的数据时唯一的,不能有重复。


复合主键

什么是复合主键呢,我们上面是一列是主键,但是主键不一定只有一列,可以有多列啊,这被称为复合主键,我们来设置一下复合主键:

这就是设置复合主键,我们来看看复合主键有什么特征:

a和b都被设置为了主键。

我们来插入几组值试试:

插入三组值已经足够说明问题了。


结论:当我们插入的被设为主键的值和历史上插入过的数据都相同时,是不被允许插入的,但是当我们插入的数据只有一个是和历史上的数据是相同的,是可以被允许的。

总结

在本文中,我们深入探讨了 MySQL 中几个常用的表约束,包括 NULL 约束、DEFAULT 约束、COMMENT 约束、主键约束以及 ZEROFILL 约束。这些约束在数据库设计中扮演着至关重要的角色,通过它们可以确保数据的有效性和完整性,帮助开发者避免无效数据的插入,并提升数据表的可维护性。掌握这些约束的使用,能够让我们在实际开发中构建出更加健壮和清晰的数据库结构,从而提升系统的稳定性和可扩展性。希望通过本文的介绍,大家对 MySQL 的表约束有了更深入的理解,并能够在实际项目中灵活应用。

相关推荐
用户861782773651817 分钟前
MySQL 8.0从库宕机排查实录:中继日志膨胀引发的连锁故障复盘
mysql
Kapaseker1 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴1 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭11 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab12 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe18 小时前
Now in Android 架构模式全面分析
android·android jetpack
随风飘的云1 天前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少1 天前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker1 天前
一杯美式搞定 Kotlin 空安全
android·kotlin