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

文章目录

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

🚀数据库的约束

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

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

是关系型数据库的一个重要功能,主要作用是保证数据的完整性,也可以理解为数据的正确性(数据本身是否正确,关联关系是否正确)

人工检查数据完成性工作量非常大,在数据表中定义一些约束,那么数据库写入数据的时候,数据库会帮我们进行校验工作

约束一般是指定在列上的

约束类型:

🪐①.NOT NULL非空约束

  • 定义表时某些列不允许为NULL时,可以为列添加非空约束


    这就是数据库帮我们做的一次校验

🪐②.UNIQUE唯一性约束

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

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



🪐③.DEFAULT默认值约束

  • 规定没有给列赋值时的默认值
java 复制代码
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来进行演示

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

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

java 复制代码
foreign key(字段名) reference 主表(列)



通过外键约束,保证数据的完整性和关系的正确性

🛰️删除

  • 删除主表中的数据

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


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

🛰️check

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

练习中会遇到的问题

写入记录时,由于各种原因报错了(主外键约束or语法...)

当insert 操作时,就会先生成一个主键值,不论记录写入成功与否,这个主键值都会视为已使用

下一次写入记录时,会发现主键值不连续的现象
在真正的开发环境中对我的是没有影响的,数据库本身也是根据数据结构来排序的,只要大小关系正确就可以,开发环境中数据是成千上万的,我们也不好发现,是没有影响的

🛰️总结

相关推荐
廖圣平9 分钟前
美团核销 第三方接口供应商 (含接口文档)
开发语言·数据库·php
@解忧杂货铺27 分钟前
MySQL历史版本下载及安装配置教程
数据库·mysql
hnlucky33 分钟前
《基于 Kubernetes 的 WordPress 高可用部署实践:从 MariaDB 到 Nginx 反向代理》
运维·数据库·nginx·云原生·容器·kubernetes·mariadb
dgiij38 分钟前
excel大表导入数据库
数据库·mysql·node.js·excel
多敲代码防脱发42 分钟前
导出导入Excel文件(详解-基于EasyExcel)
java·开发语言·jvm·数据库·mysql·excel
风筝超冷1 小时前
获取高德地图JS API的安全密钥和Key的方法
服务器·mysql·js api
数据库幼崽1 小时前
MySQL 8.0 OCP 1Z0-908 51-60题
数据库·mysql·ocp
didiplus1 小时前
MySQL 8.0 OCP(1Z0-908)英文题库(31-40)
mysql·adb·ocp·数据库管理员·mysql认证
didiplus1 小时前
MySQL 8.0 OCP(1Z0-908)英文题库(21-30)
mysql·dba·认证考试·题库