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

【MySQL】(6) 数据库约束

一、约束的作用

        就是自动对数据、表间关联关系的正确性校验,一般在列上加约束。

二、各种约束

1、非空约束 not null

        限制数据值不能为 null,比如学生姓名:

2、唯一约束 unique

        限制数据值唯一,比如 id:

        但是 unique 限制的 id 可以有重复的 null:

3、主键约束 primary key

        限制数据唯一且不为空,可以由一个或多个列组成,用于唯一标识数据行,建议每个表都有一个主键,但一个表最多只能有一个主键最多只能有一个 auto_increment 列,主键类型建议为 bigint。

        插入数据:

        当插入失败时(比如设置 id 为重复值),插入失败的那个自增值会失效(auto_imcrement 只会增加,不会减少):

        当预计插入数据的主键、唯一键会有重复时,可以用以下两种语法(先把 name 设置为 unique):

        语法1:主键、唯一键冲突,则更新数据;不冲突,则直接插入(恢复到原样再执行):

        语法2:主键、唯一键冲突,则删除数据,再添加;不冲突,则直接插入:

        在工作中是不建议替换旧记录的,应该先查询有没有冲突,没有就插入。有就做更新操作,要么把旧记录的 deleteState 设为 1,再添加新记录。

        修改 (id, name) 为一个主键:

        primary key 和 not null + unique 是不一样的。primary key 是表的属性,一个表只能有一个主键;而 not null + unique 是业务数据的要求,一个表中的很多数据都可以是 not null + unique 。

4、外键约束 foreign key

        外键约束定义了主表和从表之间的关系外键约束定义在从表中,从表引用的主表列必须是主键或唯一键。当从表中的外键约束列添加值时,只能从主表的引用列中的值选择,或者为 null

        语法:

        创建班级表和学生表:

drop table if exists class;
create table class (
  id bigint primary key auto_increment,
  name varchar(20) not null
);
insert into class (name) values ('java01'), ('java02'), ('java03'), ('C++01'), ('C++02');

drop table if exists student;
create table student(
  id bigint PRIMARY KEY auto_increment,  
  name varchar(20) not null,
  age int DEFAULT 18,
  class_id bigint,
  foreign key (class_id) references class(id)  # 外键约束
);

        查看表结构:

        插入一个不存在的班级编号的学生信息:

        如果从表引用了主表中的列值,主表就不能随意删除该列值,或者删除主表。如果非要删除,从表必须删除引用的值,或者删除外键约束:

        外键约束影响数据库效率,数据量很大时,在 java 程序中处理关联关系,校验好后再入库。

5、默认约束 default

        就是给列一个默认值,插入数据时,若没有给该列指定值,则给默认值。如果给了指定值,不管是 null 还是不是 null,都以设置的值为准

6、check 约束

        就是对数据值限定一个范围,8.0.16 版本后才起作用,check 约束也会像外键约束一样自动设置一个 check 约束名。语法如下:

        因为很多老版本 MySQL 不支持 check,所以把校验放在 java 程序中。

        常用的就是非空、唯一、主键、默认约束,外键约束在大公司不用,check 约束不用。

相关文章:

  • 使用unsloth进行grpo强化学习训练
  • html5制作2048游戏开发心得与技术分享
  • 仿最美博客POETIZE(简易版)
  • Android (Kotlin) 高版本 DownloadManager 封装工具类,支持 APK 断点续传与自动安装
  • Python基于深度学习的多模态人脸情绪识别研究与实现
  • DeepSeek使用指南
  • 什么是物理信息神经网络PINN
  • LeetCode hot 100 每日一题(8)——438. 找到字符串中所有字母异位词
  • p5.js:绘制各种内置的几何体,还能旋转
  • 设计模式分类解析与JavaScript实现
  • Linux Redis安装部署、注册服务
  • 蓝桥杯专项复习——stl(stack、queue)
  • hadoop伪分布式搭建--启动过程中如果发现某个datanode出现问题,如何处理?
  • 24.策略模式实现日志
  • leetcode日记(101)填充每个节点的下一个右侧节点指针Ⅱ
  • Deepseek+QuickAPI:打造 MySQL AI 智能体入门篇(一)
  • CVE-2017-5645(使用 docker 搭建)
  • Java面试:集合框架体系
  • 【web逆向】优某愿 字体混淆
  • 提升fcp
  • 台湾关闭最后的核电,岛内担忧“非核家园”缺电、涨电价困局难解
  • 菲律宾选举委员会公布中期选举结果,马科斯阵营选情未达预期
  • 马上评|家长抱婴儿值护学岗,如何避免“被自愿”?
  • 马上评|文玩字画竞拍轻松赚差价?严防这类新型传销
  • 互降关税后,从中国至美国的集装箱运输预订量飙升近300%
  • 上海市重大工程一季度开局良好,崇明线等按既定计划加快建设