MySQL_数据库的约束

article/2025/9/28 3:15:39

文章目录

1. NULL约束

2. UNIQUE(唯一约束)

3. DEFAULT(默认值约束)

4. PRIMARY KEY(主键约束)

5. FOREIGN KEY(外键约束)


 

数据库的约束就是关系型数据库给我们提供的一种"校验数据"合法性的机制

1. NULL约束

创建表时,可以指定某列不为空

create table student(id int not null,sn int,name varchar(20),qq_mail varchar(20)
);mysql> desc student;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| sn      | int(11)     | YES  |     | NULL    |       |
| name    | varchar(20) | YES  |     | NULL    |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

2. UNIQUE(唯一约束)

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

重新设置一下表的结构

create table student1(id int not null,sn int unique,name varchar(20),qq_mail varchar(20)
);mysql> desc student1;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| sn      | int(11)     | YES  | UNI | NULL    |       |
| name    | varchar(20) | YES  |     | NULL    |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

表示sn这列的值时唯一的不重复的

3. DEFAULT(默认值约束)

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

指定插入数据时,name列为空,默认值unkown

create table student2(id int not null,sn int unique,name varchar(20) default 'unkown',qq_mail varchar(20)
);mysql> desc student2;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   |     | NULL    |       |
| sn      | int(11)     | YES  | UNI | NULL    |       |
| name    | varchar(20) | YES  |     | unkown  |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

插入一个id但不插入name时:

insert into student2 (id) values (1);mysql> select*from student2;
+----+------+--------+---------+
| id | sn   | name   | qq_mail |
+----+------+--------+---------+
|  1 | NULL | unkown | NULL    |
+----+------+--------+---------+
1 row in set (0.00 sec)

name是默认值

4. PRIMARY KEY(主键约束)

NOT NULL 和 UNIQUE 的结合

确保某列有唯一标识,有助于快速找到表中的一个特定记录

create table student3(id int not null primary key,sn int unique,name varchar(20) default 'unkown',qq_mail varchar(20)
);mysql> desc student3;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(11)     | NO   | PRI | NULL    |       |
| sn      | int(11)     | YES  | UNI | NULL    |       |
| name    | varchar(20) | YES  |     | unkown  |       |
| qq_mail | varchar(20) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

主键是not null 和 unique 的结合,也可以不用 not null

id int primary key 

对于整数类型的主键,例如id,常搭配自增长auto_increment来使用

当插入数据对应字段不给定值时,使用最大值加一

mysql> create table student4(id int primary key auto_increment,sn int unique,name varchar(20) default 'unkown',qq_mail varchar(20)
);

接下来我们插入记录时,id为null

mysql> insert into student4 values (null,1000,'zhangsan',null);
Query OK, 1 row affected (0.00 sec)mysql> insert into student4 values (null,1001,'zhangsi',null);
Query OK, 1 row affected (0.00 sec)//将id置为100
insert into student4 values(100,1002,'zhangwu',null);
//将id置为null
insert into student4 values(null,1003,'zhangliu',null);结果
mysql> select *from student4;
+-----+------+----------+---------+
| id  | sn   | name     | qq_mail |
+-----+------+----------+---------+
|   1 | 1000 | zhangsan | NULL    |
|   2 | 1001 | zhangsi  | NULL    |
| 100 | 1002 | zhangwu  | NULL    |
| 101 | 1003 | zhangliu | NULL    |
+-----+------+----------+---------+
4 rows in set (0.00 sec)

可以看出,使用自增长之后,插入数据给值时,用给定的值插入,插入数据不给值时,默认插入最近一次的最大值+1

5. FOREIGN KEY(外键约束)

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

创建一个班级表class,id为主键.

创建学生表student,一个学生对应一个班级,一个班级对应多个学生。使用id为主键, classes_id为外键,关联班级表id

create table class(id int primary key,name varchar(20),`desc` VARCHAR(100)
);
Query OK, 0 rows affected (0.03 sec)mysql> desc class;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI | NULL    |       |
| name  | varchar(20)  | YES  |     | NULL    |       |
| desc  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
create table student5(id int primary key auto_increment,sn int unique,name varchar(20) default 'unknow',qq_mail varchar(20),class_id int,foreign key(class_id) references class(id)
);
Query OK, 0 rows affected (0.03 sec)mysql> desc student5;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| sn       | int(11)     | YES  | UNI | NULL    |                |
| name     | varchar(20) | YES  |     | unknow  |                |
| qq_mail  | varchar(20) | YES  |     | NULL    |                |
| class_id | int(11)     | YES  | MUL | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

此时学生表就和班级表关联起来了

外键约束是两个表之间的相互约束

3db817efb33547f09cfbd87fc677b246.png

 我们插入一个非法数据,现在class的id列还是空的,插任何数据都会不合法

insert into student5 values(1,1001,'张三',null,10);ERROR 1452 (23000): Cannot add or update a child row:a foreign key constraint fails (`java_3`.`student5`,CONSTRAINT `student5_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))

插入失败,因为class的id列没有10这个数据

说明学生表中的数据依赖于班级表的数据,班级表的数据对学生表的数据产生约束力,班级表为父表,学生表为子表

我们先给班级表和学生表插入数据

mysql> insert into class values(1,'java001',null);
Query OK, 1 row affected (0.00 sec)mysql> insert into student5 values(1,1001,'张三',null,1);
Query OK, 1 row affected (0.00 sec)mysql> select*from class;
+----+---------+------+
| id | name    | desc |
+----+---------+------+
|  1 | java001 | NULL |
+----+---------+------+
1 row in set (0.00 sec)mysql> select*from student5;
+----+------+------+---------+----------+
| id | sn   | name | qq_mail | class_id |
+----+------+------+---------+----------+
|  1 | 1001 | 张三 | NULL    |        1 |
+----+------+------+---------+----------+
1 row in set (0.00 sec)

因为数据都是合法的,所以成功插入

下面举例说明子表也会反过来约束父表

mysql> delete from class where id = 1;
ERROR 1451 (23000): 
Cannot delete or update a parent row: a foreign key constraint fails (`java_3`.`student5`, CONSTRAINT `student5_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))

当我们删除班级表中的数据时,发现删除失败

原因是班级表的数据被学生表给引用了,如果删除成功,那么子表的数据就没有意义了

因此父表的数据被引用时,是不能删除的,如果要删除,就先删除子表后删除父表

 

 


http://chatgpt.dhexx.cn/article/NCrfAGmw.shtml

相关文章

MYSQL--数据库约束

文章目录 1.数据库约束1.1约束类型1.2 null约束1.3 unique:唯一约束条件1.4 default:默认值约束1.5 primary key1.6 foreign key:外键约束 2.表的设计2.1一对一2.2一对多2.3多对多 1.数据库约束 1.1约束类型 not null: 指示某列不能存储null值;unique: 保证某列的…

MySQL 数据库约束

目录 一、数据库约束 1、约束类型 二、NULL 约束 三、unique 约束 四、default 约束 五、primary key 约束 自增主键 六、foreign key 外键约束 七、check 约束 一、数据库约束 我们使用数据库来存储数据,一般是希望这里存储的数据是靠谱的,…

数据库的约束和设计(完整版)

第一部分(约束和表设计) 1、DQL查询语句-limit语句(掌握) LIMIT是限制的意思,所以LIMIT的作用就是限制查询记录的条数 LIMIT语句格式: SELECT 字段 FROM 表名 LIMIT 索引, 显示条数; 索引:从0开始,一直变化 显示条数:每页显示…

MySQL数据库之数据库约束,一文带你了解

前言 从今天开始本系列就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约 【1785】字,不说废话,只讲可以让你学…

数据库的约束和设计

约束 作用 对表中的数据进行进一步的限制, 保证数据的正确性, 有效性和完整性 种类 primary key : 主键约束unique : 唯一约束not null : 非空约束default : 默认值foreign key : 外键约束auto_increment : 自增约束(适用于int数据类型) 主键约束 特点 非空且唯一 注意事项 …

MySQL:数据库的约束

目录 1.数据库约束 1.1 非空:not null 1.2 唯一:unique ​​​​​​​ 1.3 默认值:default 1.4 列描述:comment 1.5 主键约束:primary key 1.6 外键约束 1.7 综合案例 2.插入查询结果 3.聚合函数 4.group by…

oracle数据库:约束

约束简介 约束是数据库用来确保数据满足业务规则的手段,不过在真正的企业开发中,除了主键约束这类具有强需求的约束,像外键约束,检查约束更多时候仅仅出现在数据库设计阶段,真实环境却很少应用,更多是放到…

[数据库]表的约束

●🧑个人主页:你帅你先说. ●📃欢迎点赞👍关注💡收藏💖 ●📖既选择了远方,便只顾风雨兼程。 ●🤟欢迎大家有问题随时私信我! ●🧐版权:本文由[你帅…

MySQL数据库,数据的约束

目录 1.数据的约束 1.1约束的类型 1.2NULL约束 1.3UNIQUE约束 1.4DEFAULT约束 1.5PRIMARY KEY约束 1.6FOREIGN KEY约束 1.数据的约束 首先,创建一个名为test的数据库: mysql> create database test charset utf8; Query OK, 1 row affected …

MySQL数据库(数据库约束)

目录 数据库约束 数据库约束的类型: null约束 : unique约束(唯一约束): default约束(默认值约束): primary key约束(主键约束): for…

数据库中的8种常见约束定义

数据库中常见约束的定义理解和应用(附代码) 首先来说数据库中约束的定义是什么? 约束定义:按照表中的数据规则,如果存在违反约束的数据行为,行为就会被阻止。 一般在创建表之后就会创建相关列的约束&#…

基础SQL第二课:约束

一、约束: 什么是约束? 为了确保表中的数据的完整性(准确性、正确性),为表添加一些限制。是数据库中表设计的一个最基本规则。使用约束可以使数据更加准确,从而减少冗余数据(脏数据)。 数据库完整性约束分…

sublime解决中文乱码问题

首先找到你选择的build-system,如下图所示: 第二步:找到preferences下的browse packages,点击进入目录 第三步:找到对应的.sublime-build文件 第四步:打开文件,将"env": {"LANG&…

sublime text 3211 安装中文包

sublime text 3211 安装中文包 安装步骤: 1、打开Sublime Text3,选择Preferences ->Package Contorol 2、在Sublime Text3 弹窗输入install package,选择对应命令,然后鼠标点击安装install package 3、等待一会Sublime Text3 的 insta…

Sublime 中文命名乱码(显示为方框)

今天在使用Sublime中发现,将文件名以部分文字以中文命名,非中文部分能正常显示,中文部分显示不出来。如下图所示 这里就是python能显示出来,其他的汉字就变成了方框。与此对应的现象还有部分文本的部分内容显示为繁体 &#xff0…

解决sublime汉化后部分中文显示为繁体字

解决sublime汉化后部分中文显示为繁体字 1. 问题描述2. 解决方法3. 修正之后的效果 1. 问题描述 使用插件下载汉化包之后,部门字体仍显示为繁体,如下图 这种字体看着实在是别扭的不行 2. 解决方法 找到首选项 -> 设置 添加以下内容 "font_o…

关于sublime中文上下跳动错位的解决方法

关于sublime中文上下跳动错位的解决方法 在preferences-settings打开 增加"font_options":[“gdi”] 对比效果如下:

Sublime text文本编辑器中文乱码解决方法

Sublime text 出现中文乱码的解决方法 问题描述 Sublime text文本编辑器用起来感觉挺好的,它的代码补全功能非常不错,界面也很漂亮。 最近在学习C语言,我感觉Dev-C的界面比较朴实,代码补全功能操作性太强。因此,我会…

Sublime Text3 中文错位解决办法

在使用prettytable库打印列表时偶然发现,相同的中英文混合字符串表格在Windoows控制台以及NotePad上能对齐显示,在SublimeText3以及EmEditor上无法对齐显示: Windoows控制台(能对齐显示): EmEditor&…

sublime离线插件安装

一、首先需要安装Package Control 参考官网:Installation - Package Control中的方法。 其中分联网自动下载安装和手动两种。本文介绍手动的。 Click the Preferences > Browse Packages… menuBrowse up a folder and then into the Installed Packages/ fold…