Bootstrap

[Mysql] 的基础知识和sql 语句.教你速成(下)——数据库的约束篇

目录

前言

约束

一.我们为什么需要约束

二.常见的约束类型

NOT NULL 约束

UNIQUE 约束

DEFAULT 约束

PRIMARY KEY

FOREIGN KEY

CHECK约束

原因:

结尾


前言

距离上篇的更新已经快两周了,这个时候大伙都已经考完了吧!现在更新多少有点马后炮,但是没办法呀,笔者是明天考试,所以今天更新也很合理吧!!!!

本来呢,读者想一口气全写完

数据库的约束,聚合查询,联合查询

索引,事物,Mysql 的 JDBC 编程

但是呢,实在是太多了,写完起码话5-6个小时,为了让我偷懒和拥有更好的治疗,我一分为四

这是第一篇,主要介绍约束.

好的好的,现在开始进入正文

约束

一.我们为什么需要约束

约束(Constraints)是用于确保数据库中的数据准确性和完整性的重要机制。

通俗来说,有以下好处

  • 防止错误数据进入数据库

    • 约束就像门卫,确保只有符合条件的数据才能进来。例如,NOT NULL约束确保某列不能有空值,就像你填写表格时,有些栏位是必填的。
  • 确保数据独一无二

    • UNIQUE约束确保一列中的值不能重复。就像一个班级的学生学号,每个学生都有一个独一无二的学号,不能重复。
  • 保证数据之间的关系

    • 外键约束确保两个表之间的关系是正确的。比如,订单表中的客户ID必须在客户表中存在。这样避免了孤立的订单记录。
  • 自动帮你检查数据有效性

    • CHECK约束可以自动检查数据是否符合特定条件。比如年龄字段只能填0到120之间的数字,这样避免了输入不合理的数据。
  • 提高查询速度

    • 主键约束和索引一起用,可以加快数据查询的速度。就像一本书有目录,可以快速找到你需要的信息。(这个在以后的索引也会提到)
  • 确保数据的一致性

    • 约束可以确保数据的一致性和正确性。比如,如果一个学生被删除,那么他的成绩记录也会自动删除。

二.常见的约束类型

常见的约束类型有

NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
DEFAULT - 规定没有给列赋值时的默认值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标
识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
好的,接下来我们通过一些实例来理解如果运用
首先,我们建立一个练习用的student 表
create table student (id int,name varchar(20),class varchar(20) primary key);

有ID 列,有姓名列,还有班级列,班级列我们增加了一个 primary key,也就是主键约束

NOT NULL 约束

约束一般加在列的数据类型的后面

NOT NULL 约束顾名思义,有了这个约束以后,列中的值就不能为空了,下面是实例

我们重新建立student表

create table student2 (id int not null,name varchar(20),class varchar(20) primary key);

可以看到,我给 ID列插入了not null 约束,现在,我们试着插入值

insert into student2 values(2,'张三','一班');
insert into student2 values(3,'张三','二班');

效果如图

 假设插一个空值呢?

insert into student2 values(null,'张三','三班');
insert into student2 values(4,null,'三班');

作为控制变量,我们看看结果

这就是 NOT NULL 约束的作用和示例 

UNIQUE 约束

确保所有值在某一列或某几列中的值是唯一的,没有重复。

示例如下,建立一个表,带有unique约束

 create table student3(id int unique, name varchar(20));

 如果插入的数据有重复ID 效果如下


mysql> insert into student3 values(1,'张三');
Query OK, 1 row affected (0.01 sec)

mysql> insert into student3 values(1,'张');
ERROR 1062 (23000): Duplicate entry '1' for key 'student3.id'

DEFAULT 约束

如果给一个人为定义的默认值

create table student3(id int , name varchar(20) default '张三');


insert into student3 values(1,null),(2,'fxb');


 insert into student3 (id) values(2);
// 只指定ID列,这时,会启动默认值

效果如图所示

 可以看到,默认值被我们设置为了张三,而不是NULL 了.

PRIMARY KEY

- NOT NULL 和 UNIQUE 的结合。

这意味着它拥有前两个约束的功能,所以笔者就不举例子了,除此以外,他还有如下作用

提高查询性能

主键通常会自动创建一个唯一索引,这使得查询速度更快。当根据主键查找记录时,数据库管理系统可以快速定位到具体的行。这对于大型表格尤其重要,因为它可以显著提高查询性能。

建立表之间的关系

在关系数据库中,主键通常用于在不同的表之间建立关系。通过将一个表的主键作为另一个表的外键,可以实现表之间的关联。这种方式称为引用完整性。例如,订单表可以有一个外键 customer_id,引用客户表的主键 id,从而关联订单和客户。我们接下来可以在外键约束中看到

注意

对于整数类型的主键,常配搭自增长 auto_increment 来使用。插入数据对应字段不给值时,使用最大值+1

FOREIGN KEY

外键用于关联其他表的 主键 唯一键
说人话,就是之前的约束都是作用在单一表中的,而到了外键约束,就有两张表了,存在父子表
子表的某一列数据范围受到父表的那一列的约束,比如刚刚说的  
      订单表可以有一个外键 customer_id,引用客户表的主键 id,从而关联订单和客户。
这里,订单表就是我们的子表,而我们的客户表就是父表, 订单表中的每个ID,都要在客户表中找得到,
确保订单是对的.
如果还是看不懂,就看到我们的一开始建立的student 表
create table student (id int,name varchar(20),class varchar(20) primary key);

 我们以 class 作为外键,引用父表的 主键classid , 确保我们学生所在的班级,肯定是班级表里的班级,避免有错误没人能发现.   

(即子表的列为外键,引用父表的主键)

好的,那我们现在去建立父表吧

CREATE TABLE class (
    classid int PRIMARY KEY,
    classname VARCHAR(20)
);

然后删除学生表,重新关联

CREATE TABLE student (
    id int,
    name varchar(20),
    class int,
    PRIMARY KEY (class),
    FOREIGN KEY (class) REFERENCES class(classid)
);

记住我们的写法,将子表的某一列作为外键(foreign key) 去 referen 父表的 某一列

也同样记住作用,以上述例子为例,一旦关联成功以后,子表student 关于class 的数据都必须在父表的classid 中出现过,否则,是无法插入的

接下来,我们将举例分析

mysql> insert into class values(110,'一班');
Query OK, 1 row affected (0.01 sec)

mysql> insert into class values(111,'二班');
Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(112,'三班');
Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(113,'四班');
Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(114,'五班');
Query OK, 1 row affected (0.00 sec)

我们给class 表插入以下五个数据

 接下来,我们试着给子表插入一些数据,看看是否符合上述所言

mysql> insert into student values(1,'张三',110);

mysql> insert into student values(2,'李四',111);

mysql> insert into student values(2,'王五',112);

mysql> insert into student values(2,'赵六',102);

他们的结果如下

mysql> insert into student values(2,'赵六',102);

ERROR 1452 (23000): Cannot add or update a child row:
 a foreign key constraint fails 
(`connect`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class`) 
REFERENCES `class` (`classid`))

 

 可以看到,只要父表中没有对应数据,就加不上去

除此以外,还有一个作用

如果你要修改/删除父表中的值,但是这个值已经被子表引用了,你就无法删除/修改

以删除举例

mysql> delete from class where classid=110;

结果只会是

ERROR 1451 (23000):
 Cannot delete or update a parent row: a foreign key constraint fails 
(`connect`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class`)
 REFERENCES `class` (`classid`))

同样,你也无法把表给删了

mysql> drop table class;
ERROR 3730 (HY000):
 Cannot drop table 'class' referenced by a foreign key constraint 'student_ibfk_1' on table 'student'

注意

使用外键约束的时候,父表的那一列需要有 unique 或者 primary key 修饰,子表没有这个要求

关于 外键约束,写的有点乱,大伙凑合着看

CHECK约束

这个呢MySQL使用时不报错,但忽略该约束:

原因:

MySQL 的设计理念中,目前并没有实现 CHECK 约束的完全功能。CHECK 约束通常用于在插入或更新数据时,对指定列的值进行条件检查,只有满足条件的值才能被接受。这在其他一些关系型数据库管理系统(如 PostgreSQL)中是支持的。

结尾

好的,下篇中的约束篇写完了,下次更新聚合查询和联合查询篇.

;