目录
前言
约束
一.我们为什么需要约束
二.常见的约束类型
NOT NULL 约束
UNIQUE 约束
DEFAULT 约束
PRIMARY KEY
FOREIGN KEY
CHECK约束
原因:
结尾
前言
距离上篇的更新已经快两周了,这个时候大伙都已经考完了吧!现在更新多少有点马后炮,但是没办法呀,笔者是明天考试,所以今天更新也很合理吧!!!!
本来呢,读者想一口气全写完
数据库的约束,聚合查询,联合查询
索引,事物,Mysql 的 JDBC 编程
但是呢,实在是太多了,写完起码话5-6个小时,为了让我偷懒和拥有更好的治疗,我一分为四
这是第一篇,主要介绍约束.
好的好的,现在开始进入正文
约束
一.我们为什么需要约束
约束(Constraints)是用于确保数据库中的数据准确性和完整性的重要机制。
通俗来说,有以下好处
-
防止错误数据进入数据库:
- 约束就像门卫,确保只有符合条件的数据才能进来。例如,NOT NULL约束确保某列不能有空值,就像你填写表格时,有些栏位是必填的。
-
确保数据独一无二:
- UNIQUE约束确保一列中的值不能重复。就像一个班级的学生学号,每个学生都有一个独一无二的学号,不能重复。
-
保证数据之间的关系:
- 外键约束确保两个表之间的关系是正确的。比如,订单表中的客户ID必须在客户表中存在。这样避免了孤立的订单记录。
-
自动帮你检查数据有效性:
- CHECK约束可以自动检查数据是否符合特定条件。比如年龄字段只能填0到120之间的数字,这样避免了输入不合理的数据。
-
提高查询速度:
- 主键约束和索引一起用,可以加快数据查询的速度。就像一本书有目录,可以快速找到你需要的信息。(这个在以后的索引也会提到)
-
确保数据的一致性:
- 约束可以确保数据的一致性和正确性。比如,如果一个学生被删除,那么他的成绩记录也会自动删除。
二.常见的约束类型
常见的约束类型有
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,从而关联订单和客户。我们接下来可以在外键约束中看到
注意
FOREIGN KEY
customer_id
,引用客户表的主键 id,从而关联订单和客户。
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)中是支持的。
结尾
好的,下篇中的约束篇写完了,下次更新聚合查询和联合查询篇.