【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 操作时,就会先生成一个主键值,不论记录写入成功与否,这个主键值都会视为已使用
下一次写入记录时,会发现主键值不连续的现象
在真正的开发环境中对我的是没有影响的,数据库本身也是根据数据结构来排序的,只要大小关系正确就可以,开发环境中数据是成千上万的,我们也不好发现,是没有影响的