MySQL数据库约束你真的懂吗?

✏️✏️✏️今天给各位带来的是关于数据库约束方面的知识

清风的CSDN博客

😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛

目录

一、NULL约束

二、UNIQUE约束

三、DEFAULT约束

[四、PRIMARY KEY约束](#四、PRIMARY KEY约束)

[五、FOREIGN KEY约束](#五、FOREIGN KEY约束)

[5.1 语法](#5.1 语法)

[5.2 案例代码](#5.2 案例代码)


一、NULL约束

NOT NULL - 指示某列不能存储 NULL 值。

现在我们创建一个student表:

sql 复制代码
 create table student(id int, name varchar(20));

可以看到,当我们没有进行约束的时候,id 和 name 都是可以为NULL的。

当前这个表没有任何的约束,所以在往表里插入NULL的时候也是可以的:

sql 复制代码
insert into student values (null, null);

那么,现在来修改一下这个student,给这个表加上NOT-NULL约束:

sql 复制代码
 create table student (id int not null,name varchar(20));

那么现在就可以看到两个表的差别了,第二次创建的表,对于id这一列,是不允许为空的。

所以当我们在插入NULL的时候,有了NOT-NULL的约束,程序就不会正常运行了:

sql 复制代码
insert into student (null,null);

对于NULL约束,还是比较容易理解的。

二、UNIQUE约束

UNIQUE - 保证某列的每行必须有唯一的值

现在还是创建一个student表,不加任何约束,并插入一个学号为 1 ,名字叫张三的记录:

sql 复制代码
 create table student(id int, name varchar(20));
 insert into student values (1,'张三');


再把张三这条记录插入进去:(程序不会报错)

此时我们创建studenet表时加入UNIQUE约束,并插入张三的记录:

sql 复制代码
create table student (id int unique, name varchar(20));
insert into student values (1,'张三');

加入UNIQUE约束后,可以看到,id这一列的key是UNI(UNIQUE)的缩写:

因此,加入UNIQUE 约束之后,后续进行插入/修改的时候,都会先进行查询,看当前这个被约束的列的值是否已经存在。约束虽然能够引入更多的检查操作,也会增加系统的开销。

三、DEFAULT约束

DEFAULT - 规定没有给列赋值时的默认值

进行指定列插入的时候,其他未被指定到的列就会被设成默认值。

在这里我们还是以上面的student为例,重新创建student表并不加任何约束:

sql 复制代码
 create table student(id int, name varchar(20));

创建表的时候,我们并没有加任何默认值约束,可以看到student表中的默认值为NULL。

当我们对student表进行指定列插入:

sql 复制代码
insert into student (id) values (1);
insert into student (name) values ('张三');

这里可以看到,进行指定列插入的时候,没有被指定的列,默认就是为NULL。

此时我们给student表加上DEFAULT约束:

sql 复制代码
 create table student (id int default 0,name varchar(20) default '无名氏');

这样一来,再次进行指定列插入的时候,没有被指定的列就会被设定为创建表时候给的默认值。

四、PRIMARY KEY约束

PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标
识,有助于更容易更快速地找到表中的一个特定的记录。其实就是主键,用来作为一个记录的标识。
现在我们创建一个带有PRIMARY KEY约束的student表:

sql 复制代码
 create table student (id int primary key,name varchar(20));

需要注意一下,一张表里面只能有一个PEIMARY KEY约束。(非空&唯一)

通常创建表的时候都会指定一个主键。除了上面基础的使用之外,还有一种情况-联合主键,它也是只有一个主键,但是这个主键是由多个列联合构成的。这里不做赘述。

加入主键约束后,插入记录的时候,主键的列是不能为空的:


其次,主键的列的值也是唯一的:

sql 复制代码
insert into student values (1,'张三');
insert into student values (1,'张三);
//再次插入和第一条同样的记录
insert into student values (1,'张三);

再次插入和第一条同样的记录,程序就会报错,因为记录重复。

五、FOREIGN KEY约束

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

5.1 语法

外键用于关联其他表的 主键唯一键:

sql 复制代码
foreign key (字段名) references 主表(列)

5.2 案例代码

创建班级表:

sql 复制代码
 create table class (class_ID int, name varchar(20));

创建学生表:

sql 复制代码
create table student (id int, name varchar(20),class_Id int);

班级是要包含学生的,比如说班级现在有这样几个插入的数据:

sql 复制代码
insert into class values 
   (1,'210701班'),
   (2,'210702班'),
   (3,'210703班');


现在,往学生表里面插入数据:

sql 复制代码
 insert into student values 
   (1,'张三',1),
   (2,'李四',2),
   (3,'王五',100);

现在,王五这个同学,不在班级表中存在,因此,这是一个不太科学的数据。而引入外键约束,就是为了解决这个问题。也就是说,希望学生表中的class_ID 都在班级表中存在,此时就可以使用外键约束。

sql 复制代码
create table class (
 class_ID int primary key,
 name varchar(20));

create table student (
 id int primary key, 
 name varchar(20), 
 class_ID int, 
 foreign key (class_ID) references class(class_ID));

前面说到的约束,都是在定义表的时候,哪一列需要约束,就创建到哪一列的后面。而外键约束,则是写到最后。即把所有前面的列都定义好了之后,在最后通过FOREIGN KEY创建外键约束。

创建外键的时候,要指定三个信息:

  • 本表哪个列
  • 引用自哪个表(references)
  • 引用自另外一个表的哪个列

此时就要求,本表(student)中这个列的数据必须要在引用的另外一个表的对应列中存在,这个情况下,也可以认为,班级表约束了学生表。把这种约束其他表的表,称为父表,而把学生表这种被约束的表,成为子表。

引入外键之后,就会在对应的父表中检查子表插入的值是否在父表中存在,不存在就报错。其实,外键约束是双向的,父表约束子表,子表也会约束父表。比如:要想删除父表的记录,必须先删除子表对应的数据,确保子表中没有数据引用父表的记录。


✨好啦,今天的分享就到这里!之后,我会给大家分享一些复杂查询,比如联合查询,聚合查询,子查询等。

🎉希望各位看官读完文章后,能够有所提升。

✨创作不易,还希望各位大佬支持一下!

👍点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论:你的意见是我进步的财富!

相关推荐
Amctwd2 分钟前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou38 分钟前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh1 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵2 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多3 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆3 小时前
MySQL——1、数据库基础
数据库·adb
Chasing__Dreams3 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存
源码云商3 小时前
【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)
数据库·vue.js·spring boot
源远流长jerry3 小时前
MySQL的缓存策略
数据库·mysql·缓存
纯纯沙口4 小时前
Qt—用SQLite实现简单的注册登录界面
数据库·sqlite