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

MySQL——数据库约束

一、什么是数据库约束?

数据库约束是用于强制数据完整性的规则,包括:主键(唯一标识)、外键(关联其他表)、唯一(禁止重复)、非空(值必填)、检查(符合条件)等,确保数据有效且关系正确。


二、约束类型


三、NOT NULL非空约束 

定义:定义表示,若某些列不允许为空,就可以为列添加非空约束。

 示例:

比如创建⼀个学生表,学生名为NULL时,这条记录是不完整的 :

我们可以通过将name字段设置为非空约束来解决:


四、DEFAULT默认值约束 

定义:DEFAULT 约束⽤于向列中插入默认值,如果没有为列设置值,那么会将默认值设置到该列 

示例:

 重构学生表,新增年龄列:


五、UNIQUE唯一约束

定义:指定了唯一约束的列,该列的值在所有记录中不能重复,比如⼀个人的身份证号,学生的学号等

示例:

 重构学生表,新增学号列:


六、PRIMARY KEY主键约束

 定义:主键约束唯一标识数据库表中的每条记录
            主键必须包含唯一的值,且不能包含 NULL 值。 
            每个表只能有一个主键,可以由单个列多个列组成。
            通常为每张表都指定一个主键,主键列建议使用BIGINT类型

示例:

(一)基础用法

重构学生表,为id列添加非空和唯一约束:

查看表结构,添加非空唯一约束之后key列为PRI(主键):

当id列相同时触发主键冲突:

通常将主键列设置为自增长,让数据库维护主键值:

插入数据时不必设置主键列的值:

查看表结构,Extra列显示auto_increment 表示自增 :

如果数据行写入失败(如语法错误),新生成的主键值作废

主键值可以不连续,且下次自增从主键最大值开始


(二)其它情况

<1>主键或唯一键冲突时的更新操作:

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

(如已有id为100,下次通过这个id产生冲突时,会将id为100的数据行进行跟新)

示例:
 插入ID为100,学号为100100的学生记录时,报主键冲突:

可以使用以上语法,如果插⼊时有冲突则更新当前列的值:


<2>替换,如果存在冲突则替换,不存在冲突则插入

语法:

其实就是将插入语句的insert改为replace

示例:

写入或更新id为101的记录(101记录存在,更新值):

写入或更新id为102的记录(102记录不存在,直接插入):


<3> 一个表中不能有多个主键


<4>复合主键:由多个列共同组成的主键,主键是否冲突以多个列的组成进行判定

重构学生表并设置符合主键:

插入两个相同数据:

修改插入的第二个数据的任意一列即可插入成功:


七、FOREIGN KEY外键约束

 定义:

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

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

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

语法:foreign key 从表字段 references 主表字段

示例:

创建班级表(主表)并初始化数据:

重构学生表(从表),添加外键约束:

查看表结构,Key列的值为MUL表示外键约束的列:

正常插入数据:

再次向student插入一条数据,班级编号为100:

向student中插入一条数据,id为null:

分别删除class表中id为5和2的两条数据:


八、CHECK约束

 定义:可以应用于⼀个或多个列,用于限制列中可接受的数据值,从而确保数据的完整性和准确性。

语法:check(条件)

示例:

重构学生表,要求年龄不小于60,性别只能是男或女:

创建新表,c1的值不能为0,c2的值必须大于0,c3的值不小于c2:

 

相关文章:

  • 智能博弈与体系对抗
  • Golang 面试题
  • C#从零开始学习(图文教程),持续更新中~
  • Docker报错:https://registry-1.docker.io/v2/
  • TexTCNN
  • 【MySQL系列文章】Linux环境下安装部署MySQL
  • 基于 Java + SSM + JSP 的百货中心供应链管理系统设计与实现
  • 用deepseek学大模型04-机器学习建模过程
  • 排序与算法:选择排序
  • MySQL的基本使用
  • 了解SQL Server不同版本(如Express、Standard、Enterprise)的功能差异和适用场景。
  • LLM论文笔记 12: Teaching Arithmetic to Small Transformers
  • Linux-C/C++《C/7、字符串处理》(字符串输入/输出、C 库中提供的字符串处理函数、正则表达式等)
  • WordPress Ai插件:支持提示词生成文章和chat智能对话
  • 深入解析 Flutter Bloc:从原理到实战
  • python1
  • 零基础入门机器学习 -- 第九章机器学习项目实战
  • 数据结构_前言
  • 【基础架构篇二】《DeepSeek容器化部署:Docker+Kubernetes集群实战》
  • 【DL】浅谈深度学习中的知识蒸馏 | 输出层知识蒸馏
  • 香港今年新股集资额已超600亿港元,暂居全球首位
  • 上海这个咖啡文化节首次“走出去”,率本土品牌亮相英国伦敦
  • 舞者王佳俊谈“与AI共舞”:像多了一个舞伴,要考虑它的“感受”
  • 武康大楼再开发:一栋楼火还不够,要带火街区“朋友圈”
  • 秦洪看盘|风格有所转变,热钱回流高弹性品种
  • 圆桌丨新能源车超充技术元年,专家呼吁重视电网承载能力可能面临的结构性挑战