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

表的约束

约束就是设定条条框框,保证被约束目标符合约束条件。表的约束就是对表内列数据的约束,保证列数据的正确性。

default

设置列数据的默认值。当用户添加记录的时候没有初始化该列的数据,就是使用默认值初始化。

如果创建表的时候没有设置默认值,会自动将默认值设置为null。

空值

往往数据库中的数据不能为空,空值不能进行数据运算。我们可以在列数据设置空属性来控制数据是否可以为空。

默认空属性为null表示数据可以为空,设置为not null即可让数据不为空。

如果插入数据,name列的数据初始值为null,会报错:name值不可以为空;如果不对name进行赋值,会报错:name没有default值。这两个报错的原因是不同的,前者是因为将值设置为null,后者是因为设置空属性not null就不会自动设置默认值,不赋值就会报错。空值和默认值也可以同时设置,但是这样的场景不多。

comment

列描述,没有实际的含义,就是为了开发人员更方便了解列的内容。

通过desc不能看到注释,只能通过show查看:

zerofill

不知道你有没有注意过数值类型的后面会有一个数,这个数看起来没什么用,其实是因为我们没有使用zerofill这个约束。

数值类型后面的数字表示数据的宽度,如果使用了zerofill当数据的长度小于宽度时,就会用0填充使其宽度符合这个值。举个例子:

设置zerofill约束后,数值类型都是无符号的。

zerofill只是在显示的时候填充0,并没有修改数据,使用原数据查找时还是可以找到的:

主键 primary key

主键可以作为表中所有记录的唯一性标识,每个表都只能有一个主键,主键约束的列的内容每个记录都不能相同不能为空,通常数值类型会作为表的主键。就像生活中的身份证号一样,任何人的身份证号都不相同,是我们社会中身份的唯一标识。

这两种约束方式都可以:

插入主键值相同的记录时就会发生错误:

虽然主键在一个表中只有一个,但是可以将多行同时设为主键,这就是复合主键。就好比我们进高铁站验身份的时候,为了保证本人操作,需要我们刷身份证同时刷脸,这个时候身份证+面部信息就是一个复合主键。

删除之前的主键,其实主键也可以看作表中的一个列:

用id和name添加一个复合主键:

在插入记录时,只有复合主键中的所有值都与已插入的数据相同时,才会报错。复合主键其实就是将每个值都拼接起来整体对比。记录(2, Mike)被认作2-Mike,所以插入(2, Sam)不会报错。

自增长 auto_increment

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

通俗来讲,就是有一个key值,你可以不用设置它,每次添加新的记录时,这个值都是上一个值+1,下面看一个例子:

我们插入几个记录,但是不指定id的值,第一个id的值就是1:

后续的id值都会在最高的值基础上+1:

如果我们添加一个id为200的记录,后续添加都是在200的基础上+1:

表中有一个auto_increment记录下一个key的值,前面的记录插入到id为203了,那么下一次就是204:

我们也可以在创建表的时候就指定这个自增值的大小,不指定就从1开始:

唯一键 unique

一张表可能不止主键的列的数据是有唯一性的。例如,一个公司的员工,工号是标识员工唯一性的数据,但是员工联系方式也是唯一的,不可能有两个人的手机号是相同的。注意,联系方式也可以作为唯一性标识,但是工号便于管理,没有用联系方式罢了。

唯一键和主键本质差不多,区别就在于唯一键的数据可以为空且不参与数据的比较。主键是用来标识唯一性的,唯一键更多是保证业务上保证数据不重复

唯一键的值为null的时候不作计算,多个记录的值为null不会报错。但是非空的唯一键值相同就会报错。

外键 foreign key

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

语法:

foreign key (从表列名) references 主表 (列名)

例子:在学生管理系统中,每个学生都有所属的班级,必然会存在两张表,学生表和班级表。学生表中记录学生信息以及学生所在班级,班级表记录班级号以及班级名称等等。

学生表的班级号和班级表的班级号是一一对应的,学生不可能在一个不存在的班级中,那么每次插入学生数据时就需要看一下学生的班级在不在班级表中。这种情况下我们就可以使用外键,将两个表上的列数据关联,班级表是主表,学生表是从表。

创建表,并在班级表插入数据,班级表的外键值必须是主键或者唯一键:

向从表插入学生数据,班级id不在班级表中就会插入失败:

http://www.lryc.cn/news/464812.html

相关文章:

  • jmeter是怎么用的,怎么设计接口测试用例的
  • 数据挖掘示例
  • 【PHP】在ThinkPHP6中Swoole与FPM的简单性能测试对比
  • 论文写作学习--POLYGCL
  • 【高等数学】无穷级数
  • 计算机网络——无连接传输UDP
  • DS几大常见排序讲解和实现(下)(15)
  • 电脑视频剪辑大比拼,谁更胜一筹?
  • 计算机毕业设计 基于Web的景区管理系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 计算生物学与生物信息学漫谈-2-测序深度/读长质量和Fasta处理
  • 基于SSM+微信小程序的电子点餐管理系统(点餐1)
  • IO进程---day5
  • ROS理论与实践学习笔记——5 ROS机器人系统仿真之URDF(Unified Robot Description Format)语法详解
  • 常见SQL注入攻击示例与原理及其防御措施
  • Node.js 中的 WebSocket 底层实现
  • MySQl数据库的基本操作
  • Egg.js 项目的合理 ESLint 配置文件模板
  • 算法专题七: 分治归并
  • 一个基于vue功能强大的表格组件--vxe-table的二次封装
  • CSS网页布局(重塑网页布局)
  • 计算机网络:数据链路层 —— 以太网(Ethernet)
  • 考研前所学c语言02(2024/10/16)
  • R语言绘图——坐标轴及图例
  • JDK中socket源码解析
  • Ansible自动化运维项目实战指南
  • MySQL【知识改变命运】10
  • Java学习教程,从入门到精通, Java 基础语法(4)
  • 反编译工具-Jclasslib的使用,与Java方法调用的探索
  • 力扣 简单 876.快慢指针
  • FineReport 计算同比增长