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

mysql基础——表的约束

我们之前在建表创建数据时,发现如果插入的数据超出本身的范围或者类型不符都会被拦截报错,这本质上就是表的一种约束,这种约束使得我们插入数据库表中的数据一定是符合预期的,约束本质就是通过技术手段,强制让我们插入正确的数据。本次我们就来讲解表中各个约束条件。

一、空属性

在mysql中,null表示什么都没有,他并不像c中的null为0或其他,也不能进行运算。

语法:在类型声明后加null/not null即可。(默认为null)

如果被not null约束了,代表我们插入数据时一定不能忽略此项。

可以看到,我们无论一起插入还是单独插入id都被许可,但如果只插入name值就会报错,因为不支持id为空。

二、默认值

我们看上图t10表的描述,发现Null列的后面还有一列——Default,该列就相当于我们C++中的缺省参数,我们不插入此项,到时候就会自动把default中的值插入。我们也可以手动改变default。

语法:name type default value;

可以发现,空属性和default也可以一起使用。我们插入时,如果不提供该项,其就会把该项的default作为参数。但是,如果是not null+default null。此时还不插入该项就会报错,因为不允许有空,且默认值也是空,代表必须有参数。

null +default  0 :传该项则代替0,不传0作为参数。

not null +default 0:传该项则代替0,不传0作为参数。

null +default null:传该项则代替null,不传null作为参数。

not +default null:插入时必须插入该项。

三、列描述

语法:在声明类型后加comment '描述'

但我们查看表的信息并没有发现列的注释,只能通过show语句

四、zerofill

还记得我们在数据类型时,有一个整型int没有提到的细节:int(m)中的m代表什么意义,我们定义变量时如果不加会发现m默认是10,这是什么东西?

如果没有zerofill,那么这个m将毫无意义,zerofill的意义是如果类型是int(m)且数据类型有zerofill,

插入的数是n位的int(n<m),那么显示的时候就会在数字前补(m-n)个0

可以看到,如果没有zerofill(password)输入什么毫无影响,但有zerofill的id就会有影响了,如果n>m,那么zerofill也会不起作用,但无论怎样,在存储数据时会把补齐的0都忽略;

五、主键(列中的Key)

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

主键是修饰某一属性的,修饰后就不允许插入相同的值。

结果也符合我们的预期,插入第二个相同的id就会失败。

当创建表时忘记加主键,我们也可以追加:

alter table 表名 add primary key(字段列表)

删除主键:

alter table 表名 drop primary key;

复合主键

如果在一个表中,我们不想只有一列拥有主键的属性,就可以用符合主键

注意:这仍符合我们的一个表只有一个主键,只是这两个合起来称为一个复合主键

复合主键的规则是:只有两列插入的数据完全相同才会报错。

六、自增长

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

自增长的特点:

任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)

自增长字段必须是整数

一张表最多只能有一个自增长

我们可以看到,我们两次插入都没有给id赋值,但是显示的是id分别是1和2,这就是自增长,没有赋值时,就会默认赋值为自增长最大值+1(默认从1开始),此时如果我们再插入一个100的id,那么下一次自增长值就是101插入。

七、唯一键

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。

唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较

关于唯一键和主键的区别: 我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。一般我们对长期不动的数据进行主键标识,比如身份证号等。

语法:

name type unique

八、外键

这是我们第一次接触到两个表之间的约束

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

语法:

foreign key (字段名) references 主表(列)

我们引入一个案例便于理解

如果将班级表中的数据都设计在每个学生表后面就会出现数据冗余,我们只需要让stu的class-id和myclass_id有关联即可——即外键约束。

先创建两个表

        

现在100号张三在10班C++班,101号张三在20班Java班。

现在我们尝试插入一个30班的学生

插入失败,因为没有这个班级。但我们插入null也可以(学生还未分配班级)

总结就是:在外键约束中,从表的限制列中不允许插入主表主表限制列之外的值(null除外)。


文章转载自:

http://hWh3ncD7.qrmyd.cn
http://uHYfskvG.qrmyd.cn
http://OSqKpPKF.qrmyd.cn
http://OEOp6gf7.qrmyd.cn
http://x1euWqrf.qrmyd.cn
http://6XGR4Rhr.qrmyd.cn
http://tiUCgN8i.qrmyd.cn
http://OpwWmUcf.qrmyd.cn
http://6yoFSKFt.qrmyd.cn
http://akATp91Y.qrmyd.cn
http://MMrZcMpE.qrmyd.cn
http://TQMhcN07.qrmyd.cn
http://G99WMDNN.qrmyd.cn
http://2RZ9I4b8.qrmyd.cn
http://j57aRjOP.qrmyd.cn
http://RJkK6e4M.qrmyd.cn
http://TfDGzhhT.qrmyd.cn
http://yR5DlcSE.qrmyd.cn
http://83N8KyVt.qrmyd.cn
http://f1oTF6H1.qrmyd.cn
http://f4KXrf89.qrmyd.cn
http://0QwsHT6B.qrmyd.cn
http://hzQnjh59.qrmyd.cn
http://b0NYdBKL.qrmyd.cn
http://GEwgP3pT.qrmyd.cn
http://0Fu2Er3f.qrmyd.cn
http://XrxaA9ah.qrmyd.cn
http://mmfoAYlZ.qrmyd.cn
http://grFPOF80.qrmyd.cn
http://zsySElG8.qrmyd.cn
http://www.dtcms.com/a/385334.html

相关文章:

  • pcre-8.44-2.ky10.x86_64.rpm怎么安装?CentOS/Kylin系统RPM包安装详细步骤(附安装包)
  • TDengine 聚合函数 COUNT 用户手册
  • STM32F103C8T6开发板入门学习——点亮LED灯
  • K-means 聚类算法:基于鸢尾花数据集的无监督学习全流程解析
  • JVM新生代/老年代垃圾回收器、内存分配与回收策略
  • 介绍一下 RetNet
  • rt-linux下__slab_alloc里的另外一处可能睡眠的逻辑
  • 如何统计DrawMeshInstancedIndirect绘制物体的Triangle数据
  • Android音视频学习路线图
  • 深入理解C语言指针(一)| 从内存到传址调用,掌握指针的核心本质
  • 代码审计-PHP专题原生开发文件上传删除包含文件操作监控Zend源码解密1day分析
  • springboot与vue中webSocket前后端连接问题
  • 数据结构——顺序存储链式存储
  • Vue 脚手架与webpack
  • pytest单元测试框架
  • CentOS7.9绿色安装mysql5.7.44
  • Cell Biology Learning Track(I)膜结构
  • 医院用的桌面管控软件有哪些?适用于医院的桌面管控软件推荐
  • 异步编程三剑客:回调、闭包与Promise组合实战
  • MySQL 主从同步(复制)实战
  • redis面试点记录
  • mysql和postgresql如何选择
  • 电磁兼容性(EMC)法规
  • 【论文笔记】Self-Supervised Point Cloud Prediction for Autonomous Driving
  • MySQL数据库(四)—— 使用MyCat实现MySQL主从读写分离实战指南
  • HTB paper
  • oracle认证有哪几种?如何选择
  • YoloV8改进策略:上采样改进|反卷积|数学上可逆的反卷积」塞进 YOLOv8,涨点不涨参!图像恢复黑科技 Converse2D 的跨界奇袭!
  • springboot netty 服务端网络编程入门与实战
  • 从零开始学AI——15