【MySQL】表的约束(1)
作者:爱写代码的刚子
时间:2024.3.11
前言:本篇博客主要讲解表的约束第一部分
表约束的概念
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
表的约束有很多,主要介绍:null/not null ,default ,comment , zerofill ,primary key , auto_increment , unique_key .
表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束的本质是通过技术手段,倒逼程序员插入正确的数据。反过来,站在mysql的视角,凡是插入进来的数据,都是符合数据约束的!
约束的最终目标:保证数据的完整性和可预期性
所以我们需要更多的约束条件
空属性
两个值:null(默认的)和not null(不为空)
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。
- NULL不参与运算
- 举例:创建一个myclass表结构:
插入对象:
查看表:
不按要求进行插入时(由于没有缺省值所以不让插入):
当我们想要插入空数据时也不会被允许:
所以这就叫做非空约束
默认值
默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
默认值生效:数据在插入的时候不给该字段赋值,默认值就会生效。
- 使用默认值创建表:
- 测试not null和default
- 如果同时设置了not null和default,当default不为空时,用户可以选择不进行数据插入,default会将数据补上;如果设置了not null但是没有设置default,用户不插入相应的数据会发生报错:
default和not null并不冲突,而是互相补充的,
- 为什么我们之前建表时可以省略一部分数据不进行插入?
mysql会自动添加default约束,并不会添加not null约束。
但是如果我们设置了not null约束,mysql就不会设置default约束。
列描述
- show create table 表名称\G查看comment内容
desc命令并不能查看comment信息
not null和default一般不需要同时出现,因为default本身有默认值,不会为空。
zerofill
设置了zerofill可以使表中的数据显示时等宽,如果宽度小于设定宽度,数据的其他位数会补上0
- 在进行数据显示的时候会补上0,但是实际上数据库里面存的是200:
验证(将b用16进制来显示):
- 如果不够位数就补上0,如果够了,就按原来的方式显示数据
这里要注意:
在SQL中,
int(10)
表示一个整数数据类型,其最大显示宽度为10个字符。然而,这个数字10实际上只是用来指定显示宽度,并不影响整数的存储或范围。在SQL中,如果尝试将超过指定宽度的数据插入到一个具有固定宽度的字段中,会发生拦截(报错)。
默认为什么创建表结构时,有符号的int默认是int(11),无符号的默认是int(10),因为有符号和无符号的最大数值转化为2进制为10位,但是有符号默认多出了一个符号位。
主键
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
建立主键,mysql会自动加上not null约束
- 主键约束: 主键对应的字段中不能重复,一旦重复,操作失败。
- 可以对主键的数据进行增删查改:
- **alter table test_key drop primary key;**删除test_key里面的主键
- 添加主键
注意:如果需要添加主键列中对应的字段有两份,就会发生添加失败。(下面以id举例)
所以要在开始建表的时候设置主键,不然后面可能会发生数据冲突,或者不知保留哪个数据
- **alter table test_key add primary key(id);**设置id为主键
注意一张表最多只能有一个主键,不意味着一个表中的主键只能添加给一列,一个主键可以添加到一列或者多列上,也就是合起来充当一个主键。(复合主键)
- 复合主键:
- 复合主键中只要有一个字段不一样就可以插入:
如果主键中字段都相同就不允许插入