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

【MySQL】第三弹——表的CRUD进阶(一)数据库约束

文章目录

  • 🚀数据库的约束
    • <font color= #FF0000 size=3>约束类型:
    • 🪐<font color= #FF0000 size=3>①.NOT NULL非空约束
    • 🪐<font color= #FF0000 size=3>②.UNIQUE唯一性约束
    • 🪐<font color= #FF0000 size=3>③.DEFAULT默认值约束
    • 🪐<font color= #FF0000 size=3>④.PRIMARY KEY
    • 🛰️外键
    • 🛰️删除
    • 🛰️check
    • 🛰️总结

🚀数据库的约束

  • 约束就是数据库可以让程序员定义一些数据的限制规则,数据库会在插入/修改数据的时候按照这些规则进行校验,检验不通过,就直接报错

约束的实质就是让我们及时发现数据中的错误,更好的保证数据的正确性

是关系型数据库的一个重要功能,主要作用是保证数据的完整性,也可以理解为数据的正确性(数据本身是否正确,关联关系是否正确)
人工检查数据完成性工作量非常大,在数据表中定义一些约束,那么数据库写入数据的时候,数据库会帮我们进行校验工作

约束一般是指定在列上的

约束类型:

在这里插入图片描述

🪐①.NOT NULL非空约束

  • 定义表时某些列不允许为NULL时,可以为列添加非空约束
    在这里插入图片描述
    在这里插入图片描述
    这就是数据库帮我们做的一次校验
    在这里插入图片描述

🪐②.UNIQUE唯一性约束

  • 保证某列的每行必须有一个唯一值

某些值在整个表中不能重复,比如身份证号,学号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🪐③.DEFAULT默认值约束

  • 规定没有给列赋值时的默认值
mysql> drop table student;
Query OK, 0 rows affected (0.00 sec)mysql> create table student (id int default 0, name varchar(20) default '未命名');
Query OK, 0 rows affected (0.01 sec)mysql> desc student;
+-------+-------------+------+-----+-----------+-------+
| Field | Type        | Null | Key | Default   | Extra |
+-------+-------------+------+-----+-----------+-------+
| id    | int(11)     | YES  |     | 0         |       |
| name  | varchar(20) | YES  |     | 未命名    |       |
+-------+-------------+------+-----+-----------+-------+
2 rows in set (0.00 sec)mysql> insert into student (id) values (1);
Query OK, 1 row affected (0.00 sec)mysql> select * from student;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | 未命名    |
+------+-----------+
1 row in set (0.00 sec)mysql> insert into student (name) values ('张三');
Query OK, 1 row affected (0.00 sec)mysql> select * from student;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | 未命名    |
|    0 | 张三      |
+------+-----------+
2 rows in set (0.00 sec)

在这里插入图片描述

在这里插入图片描述

插入时只指定了id,这时name列使用默认值填充

当为某列设置了默认约束的时候,如果不给这个列指定值才会使用默认约束

在这里插入图片描述

虽然指定的默认约束,但是当我们手动指定这一列的值为NULL时
插入的值依然是NULL,因为这个NULL是我们手动指定的,也可以理解为我们想要的值

用户指定的优先级要高于默认值

🪐④.PRIMARY KEY

  • NOT NULL 和 UNIQUE的结合,确保某列(或者两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录

主键约束的列既是非空的也是唯一的

在这里插入图片描述
在这里插入图片描述

写入数据是两个约束同时生效

主键约束帮我们校验了非空和唯一,这两个校验写入数据时对效率是有一定影响的,但是比起不做校验来说,这个性能消耗还是可以承担的,而且主键对后面所学习的索引起到了非常重要的作用

强烈建议为每张表定义一个主键

在这里插入图片描述

让数据库帮我们去维护主键的增长,不用程序员自己去计算,插入时先找到最大的值,然后在这基础上+1生成一个新的值,作为新的数据行主键(这张表中的id列)的值

  • 演示全列插入
    在写入数据时不具体的指定主键列的值,而是用NULL代替

在这里插入图片描述

这里不是说把NULL写入数据库了,而是说让数据库帮我们处理这个列的值(进行自增操作)

  • 演示指定列插入
    当指定列插入时,也会自动生成id列,作为数据行的主键列

在这里插入图片描述

可不可以指定一个主键值?–可以的,只要主键值不重复即可

在这里插入图片描述
在这里插入图片描述

那么主键值在数据表中可能是不连续的

注意!!一个表中不允许有两个主键

在这里插入图片描述

一个主键同时可以包含多个列(复合主键)

在这里插入图片描述
在这里插入图片描述

🛰️外键

  • FOREIGN KEY -保证一个表中的数据匹配另一个表中的值的参照完整性

这里命令行的形式大家也掌握的差不多了,我们尝试使用Navicat来进行演示

在这里插入图片描述

当前创建的表没有设置主外键关系

外键用于关联其他表的主键和唯一键,语法:

foreign key(字段名) reference 主表()

在这里插入图片描述

在这里插入图片描述
通过外键约束,保证数据的完整性和关系的正确性

🛰️删除

  • 删除主表中的数据

当子表中存在对主表的依赖的时候,那么能不能删除主表中相应的记录?

在这里插入图片描述
在这里插入图片描述

如果要删除主表中的记录,子表中不能有对该条记录的依赖,也就意味着要先删除子表中的记录,再去删除主表中的记录

在这里插入图片描述

🛰️check

  • check-保证列中的值符合指定的条件,对于MySQL数据库,对于check子句进行分析,但是忽略check子句

在这里插入图片描述
练习中会遇到的问题
在这里插入图片描述

写入记录时,由于各种原因报错了(主外键约束or语法…)
当insert 操作时,就会先生成一个主键值,不论记录写入成功与否,这个主键值都会视为已使用
下一次写入记录时,会发现主键值不连续的现象
在真正的开发环境中对我的是没有影响的,数据库本身也是根据数据结构来排序的,只要大小关系正确就可以,开发环境中数据是成千上万的,我们也不好发现,是没有影响的

🛰️总结

在这里插入图片描述

http://www.xdnf.cn/news/5794.html

相关文章:

  • 地址簿模块-01.需求分析
  • D-Pointer(Pimpl)设计模式(指向实现的指针)
  • 在VSCode中接入DeepSeek的指南
  • 【时时三省】(C语言基础)使用字符串处理函数
  • 基于Spring Boot+Layui构建企业级电子招投标系统实战指南
  • 人脸识别系统中的隐私与数据权利保障
  • ‌OPE.AI开放平台:一站式企业AI应用引擎
  • 前端学习(2)—— CSS详解与使用
  • centos7.x下,使用宝塔进行主从复制的原理和实践
  • 博客系统技术需求文档(基于 Flask)
  • R语言绘图 | 渐变火山图
  • Leetcode 3548. Equal Sum Grid Partition II
  • Andorid之TabLayout+ViewPager
  • 通过POI实现对word基于书签的内容替换、删除、插入
  • 网络协议与系统架构分析实战:工具与方法全解
  • 【应用密码学】实验五 公钥密码2——ECC
  • 深入 MySQL 查询优化器:Optimizer Trace 分析
  • 初入OpenCV
  • 【Qt】qss语法详解
  • [250512] Node.js 24 发布:ClangCL 构建,升级 V8 引擎、集成 npm 11
  • MapReduce 模型
  • AI 模型训练轻量化技术在军事领域的实战应用与技术解析
  • Excelize 开源基础库发布 2.9.1 版本更新
  • ThingsBoard使用Cassandra部署时性能优化
  • c++进阶——哈希表的实现
  • Linux进程信号处理(26)
  • Maven 动态插件配置:Profile的灵活集成实践
  • 小白成长之路-vim编辑
  • 阿克曼-幻宇机器人系列教程2- 机器人交互实践(Topic)
  • 快速上手Linux nfs网络文件系统