【MySQL】 约束

发布于:2025-06-05 ⋅ 阅读:(27) ⋅ 点赞:(0)

一、约束的定义

MySQL 约束是用于限制表中数据的规则,确保数据的 准确性一致性 。约束可以在创建表时定义,也可以在表创建后通过修改表结构添加。

二、常见的约束类型

2.1 NOT NULL 非空约束

加了非空约束的列不能为 NULL 值,如果可以预见某个列不可能为空,例如(性别:男 或 女 或者 保密)建议都加上非空约束,有利于查询效率的提高

这里创建一个 student 表,没有添加任何约束

我们可以往表里添加 NULL 数据,但这是无意义的

接下来通过修改表给 name 列添加上非空约束

数据库报错:不能对已经有 NULL 的列添加 非空约束

可以通过将带有 NULL 的数据删除或者将列删除重新创建来进行修改吗?

这里选择删除列后再重新创建,再尝试往 name 列里添加 NULL

数据库报错:'name' 列不能为空

对表进行查看可以看到 name 的 NULL 列变成 NO 了

但是数据依然存在,所以还是需要通过 删除数据 来进行修改,但数据量大时也不方便。所以最好还是在一开始创建表时就对每个数据做好分析,提前选择好约束

2.2 DEFAULT 默认值约束

当某个列没有被插入指定数据时则为默认值

插入数据时注意不能使用全列插入

数据库报错:列的数量和输入值的数量不一致

只能使用指定列插入才可以

查看表可以看到,hobby 列的 DEFAULT 的被修改为了 '无'

2.3 UNIQUE 唯一约束

当我们遇到需要存入不能重复的数据时(例如:身份证号,学号等等)就可以使用 UNIQUE 来指定唯一约束的列

添加约束前

将 id 列添加 UNIQUE 约束后再进行添加数据

数据库报错:添加键中的值 1 与列中值重复

注意:只添加了 UNIQUE 的列可以写入多个 NULL

查看表可以看到,id 列的 KEY 的添加了 UNI 表示不可重复

2.4 PRIMARY KEY 主键约束

主键约束唯一标识数据库表中的每条几率,可以理解为当前数据行的身份信息

主键必须包含唯一的值,且不能包含 NULL 的值(唯一且非空)

  • 既然是唯一且非空是否能用 id int unique not null 来代替主键呢?答案是不可以的,这里要区分开unique not null 是业务对数据本身的需求,primary key则是表的特性,数据如何组织依赖主键

通常为每张表指定一个主键,主键列建议使用 BIGINT 类型(范围够大)

重新创建表 student

查看表可以看到,id 列的 Key 变为了 PRI

因为 PRIMARY KEY 的特性一般把主键设为自动增长 (auto_increment),插入数据对应字段不给值时,使用最大值+1。

语法:

id INT PRIMARY KEY auto_increment,

可以看到 Extra 处已经有了 自增标识,写入数据时就不用人为的去维护主键值。

可以使用指定列插入

也可以用全列插入,但是需要指定为值为 NULL(并不是为空,而是让数据库去填写)

可以通过命令 show create table 表名 来查看表的具体信息

这里的 AUTO_INCREMENT = 4 是告诉我们下个存入的数据 ID 会等于 4,如果已经设置了自动增长还主题设置 ID 值呢?数据是可以被正常添加的

AUTO_INCREMENT 的值会来到101,如果再添加一个 ID 为 4 的值,也是能正常添加的

但是 AUTO_INCREMENT 的值不会再变小,这是基于对数据的安全考虑,中间浪费的区间也能是浪费了。
每个表只能有一个主键,可以由单个列或者多个列组成。还是重新创建一个 student 表,通过PRIVARY KEY(列名1,列名2...)来指定主键,多个列组成的主键称作 复合主键

复合主键中的每一列不能同时相等

主键或唯一键冲突时的更新操作,插入否则更新

语法:

INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...

可以看到这里的更新操作针对两行进行了操作,删除了原来的行,又新增了一条记录。如果主键没有冲突则新增一条直接记录。

在实际开发中不建议直接替换老数据:

  1. 先按条件查询一下数据,有没有相应的记录
  2. 没有的话就 insert 一条新记录
  3. 有的话,要么做 update 操作,要么把原数据的删除标识置为已删除,再写一条新数据

2.5 FOREIFN KEY 外键约束

外键用于定义主表和从表之间的关系

外键约束定义在从表的列上,主表关联的列必须是主键或唯一约束

当定义外键后,要求从表中的外键列数据必须在主表的主键或唯一列存在或为 null

主要作用:

  1. 确保引用完整:防止从表引用不存在的主表记录,确保数据逻辑关系正确;
  2. 维护数据一致:当主表数据变更时,数据库可以自动处理子表相关数据;
  3. 防止孤立记录:会阻止删除被引用的主表记录,避免子表记录因主表删除或修改导致变成“孤立记录”;
  4. 优化查询性能:这样的设计方法可以减少许多不必要数据的冗余。

语法:

foreign key (class_id) references class (id)

实例:

创建一个班级表 class , id 为主键

创建一个学生表,一个学生对应一个班级,一个班级对应多个学生,用 id 为主键,class_id 为外键,关联表 id

再在表中插入数据

当我们插入引用不存在的数据或是对主表中数据进行删除时

数据库都会进行报错:不能删除这一行,有一个外键约束

如果希望实现当主表修改时,从表自动更新,需要在约定外键时,补充  ON DELETE CASCADE

 FOREIGN KEY 外键 REFERENCES 主键 ON DELETE CASCADE

如果外键约束的特性,删改一定要先删除从表中的数据,导致在实际工作中一般不使用,可以通过在 JAVA 层面处理关联关系,保证数据正确后再入库

2.6 CHECK 约束

引用于一个或多个列,用于限制列中可接受的数据值,从而确保数据的完整性和准确性

这里创建了一个 teacher 表,同时对表中的 gender 做了约束,规定只能为 男 或者 女

当我们使用规定之外的词就会进行报错,约束之内就可以正常输入

列与列直接也可以比较,需要在单独一行定义

示例:

CREATE TABLE t_check (
    c1 int check(c1 <> 0),
    c2 int check(c2 > 0),
    c3 int,
    check(c3 >= c2)
);


网站公告

今日签到

点亮在社区的每一天
去签到