表的约束
在 MySQL 中,表的约束(Constraints)用于确保数据库中数据的完整性和一致性。它们定义了对表中数据的规则和限制,防止无效或不一致的数据被插入、更新或删除。常见的 MySQL 表约束包括主键约束(PRIMARY KEY)、外键约束(FOREIGN KEY)、唯一约束(UNIQUE)、非空约束(NOT NULL)、检查约束(CHECK)、默认约束(DEFAULT)、自增约束(AUTO_INCREMENT)等,这些约束可以在创建表时定义,也可以使用 ALTER TABLE
语句在已存在的表上添加或修改。合理使用约束可以大大提高数据库中数据的质量和可靠性。
但事实上真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合 法性,从业务逻辑角度保证数据的正确性。 表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,auto_increment,unique key
空属性
在 MySQL 中,空属性(NULL/NOT NULL) 是最基础也最常用的表约束之一,用于控制列是否允许存储 NULL
值(表示 "无值" 或 "未知值")。
- NULL:表示列允许存储空值(默认行为)
- NOT NULL:强制列必须存储具体值,不允许为空
注意:数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办 法参与运算。
如图所示
案例:
创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中: 如果班级没有名字,你不知道你在哪个班级 如果教室名字可以为空,就不知道在哪上课 。
所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这 就是“约束”。
如图所示
我们创建一个名为“myclass”的表来测试一下。
然后,查看一下表的数据结构。
可以看到,我们在创建数据表的时候,定义了字段“class-name”和“class-room”为 not null,以及字段“other”为 null。然后我们来测试一下这两个字段是否允许 null。
插入几组数据来做测试。
通过测试可以发现字段“other”是允许为 null 的,而字段“class-name”和“class-room”是不允许为 null 的。
默认值
在 MySQL 中,默认值约束(DEFAULT) 用于为表中的列指定一个默认值。当向表中插入数据时,如果没有为该列提供具体值,MySQL 会自动使用默认值填充。
我们创建一个名为“t13”的表来测试一下。
查看一下表的数据结构。
插入几组数据来测试一下。
查看一下插入的数据。
我们这时插入数据是正常插入的。
假设我们只插入name这一列。
可以看出,这时其余两项是默认插入的,并不是用户主动插入的。
我们创建一个表再来看一下。
查看一下这张表的数据结构。
我们可以看到Default
列是默认值。如果插入数据时没有指定该列的值,会使用默认值。name
的默认值是 NULL
,但由于 name
不允许为 NULL
,所以插入时必须显式指定 name
的值。age
的默认值是 18
。gender
的默认值是 男。
我们不妨忽略gender和age试试。
可以看出,我们所忽略的值都是被默认插入了。
注意:
与 NOT NULL 结合:默认值通常与
NOT NULL
一起使用,确保列既有默认值又不允许为空sql
函数作为默认值:MySQL 支持使用某些函数作为默认值。
插入时覆盖默认值:如果插入数据时指定了具体值,将覆盖默认值
列描述
在 MySQL 中,“列描述” 并不是一种约束,而是用于对表中的列进行说明、注释,方便其他开发者或自己后续了解列的含义等信息。可以通过 COMMENT
关键字来为列添加描述信息。
这部分我们就来简单了解一下。
创建一个表来进行测试并查看一下表结构。
插入几组数据。
解释一下,列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA 来进行了解。
zerofill
在 MySQL 中,ZEROFILL
是一种针对数值类型列的特殊约束(更准确地说是一种格式属性),用于在数值的显示长度不足时,自动在前面补零(0)。
- 仅影响数值的显示形式,不改变数据的实际存储值
- 自动为列隐式添加
UNSIGNED
属性(无符号,即只能存储非负数值)
如图所示
创建一个表,并查看一下它的表结构。
可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?其实没有zerofill这个 属性,括号内的数字是毫无意义的。
现在我们来插入几组数据。
接着修改一下它的数据结构。
但是对列添加了zerofill属性后,显示的结果就有所不同了。
这次可以看到b的值由原来的2变成00002,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是10),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。为什 么是这样呢?我们可以用hex函数来证明。