MySQL数据库,数据的约束

article/2025/9/28 4:40:53

目录

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 (0.00 sec)mysql> use test;
Database changed

下方的所有测试表,都是在这个test数据库中进行创建的。


1.1约束的类型

  • NOT NULL - 指定某列不得为NULL(空)
  • UNIQUE - 唯一值,每一列的值都是不同的
  • DEFAULT - 默认值,当这列没有内容时会给定一个默认值
  • PRIMARY KEY - 主键,是NOT NULL和UNIQUE的结合意为不为空的且唯一的,方便我们快速的查找某一信息
  • FOREIGN KEY - 外键,保证一个表中的数据匹配另一个表中的值的参照完整性

1.2NULL约束

null也就是为空的情况,当我们创建一个表后,表中的数据的结构默认都是为null也就是可以什么都不填。当我们把这个表中的某个字段进行not null约束时,这时这个字段就不得为空了。

创建一个测试表mytest1:


mysql> create table mytest1(-> id int not null,-> name varchar(10));
Query OK, 0 rows affected (0.02 sec)

此时mytest1表的结构为:


当我进行插入数据时程序是可以正常的进行通过的:

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

此时mytest1表内容为:

当我们进行指定列插入,只指定name这一列进行插入时:

mysql> insert into mytest1(name) values('李四');
ERROR 1364 (HY000): Field 'id' doesn't have a default value

出现错误ERROR 1364 (HY000): Field 'id' doesn't have a default value,错误意为:错误1364 (HY000):字段“id”没有默认值 。因此,当我在创建表的时候把id约束为了not null 那么这个字段就为必填项。通过上述讲解,详细大家已经知道了not null约束的作用了。


1.3UNIQUE约束

unique这个约束意为唯一值,当表中的某个字段被unique约束时。这个字段的任何一行的数据都是独立的,也就是这个表中的每一行数据之间都不得相同。

创建一个测试表mytest2:

mysql> create table mytest2(-> id int unique,-> name varchar(20));
Query OK, 0 rows affected (0.02 sec)

此时mytest2表的结构为:

 多行插入,插入两行数据:

mysql> insert into mytest2(id,name) values-> (1,'张三'),-> (2,'李四');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

此时,mytest2表的内容为:

 当我们插入这样一条记录时:

mysql> insert into mytest2(id,name) values(1,'王五');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'

出现错误ERROR 1062 (23000): Duplicate entry '1' for key 'id',错误意为:错误1062(23000):密钥“id”的重复条目“1” 。因此,当我们的字段加上unique约束时只得插入唯一的数据。


1.4DEFAULT约束

default约束意为默认值,当表中某个字段被default约束时,如果该字段在插入时没有填入相应的数据时,此时该列内显示的就是被default约束的默认值。

创建一个测试表mytest3:

mysql> create table mytest3(-> id int,-> name varchar(20) default '阿三');
Query OK, 0 rows affected (0.02 sec)

此时mytest3的表结构为:

插入指定列id:

mysql> insert into mytest3(id) values(1);
Query OK, 1 row affected (0.01 sec)
mysql> select * from mytest3;
+------+------+
| id   | name |
+------+------+
|    1 | 阿三 |
+------+------+
1 row in set (0.00 sec)

通过上述代码我们可以发现name默认显示了阿三这条信息,这就是default的用处,设置某字段的默认值。


1.5PRIMARY KEY约束

primary key约束意为主键,这个约束是not null和unique的结合体,也就是当表中某个字段被primary key约束时,这个字段不得为空且不能重复。

创建一个测试表mytest4:

mysql> create table mytest4(-> id int primary key,-> name varchar(20));
Query OK, 0 rows affected (0.02 sec)

 插入三行数据:

mysql> insert into mytest4(id,name) values-> (1,'张三'),-> (2,'李四'),-> (1,'王五');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

在上述代码中,第一条数据和第三条数据的id都相同了。从而提示ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY',意为:错误1062(23000):密钥“主”的重复条目“1” 。因此,当我们把一个字段设置为主键primary key时,不得插入相同的数据。


此外,当我们想要主键以自增的形式存在时,我们可以在primary key 后面上述auto_increment这个语句。创建一个测试表,mytest5:

mysql> create table mytest5(-> id int primary key auto_increment,-> name varchar(20));
Query OK, 0 rows affected (0.03 sec)

此时mytest5的表结构为:

 指定列插入数据,插入两行name:

mysql> insert into mytest5(name) values('张三');
Query OK, 1 row affected (0.01 sec)mysql> insert into mytest5(name) values('李四');
Query OK, 1 row affected (0.00 sec)mysql> select * from mytest5;
+----+------+
| id | name |
+----+------+
|  1 | 张三 |
|  2 | 李四 |
+----+------+
2 rows in set (0.00 sec)

通过上述代码展示,我们可以看到我们没有插入id值时,默认插入了两行主键值,并且是以1开始往后自增的。这就是 auto_increment的用处。当然,还有一个特殊的情况,如果插入了一条较大的主键时,则自增会以较大的主键进行自增。如以下代码:

mysql> insert into mytest5 values(100,'王五');
Query OK, 1 row affected (0.00 sec)mysql> insert into mytest5(name) values('赵六');
Query OK, 1 row affected (0.00 sec)mysql> select * from mytest5;
+-----+------+
| id  | name |
+-----+------+
|   1 | 张三 |
|   2 | 李四 |
| 100 | 王五 |
| 101 | 赵六 |
+-----+------+
4 rows in set (0.00 sec)

我们可以看到,在插入了一条id为100的值后,我再进行指定列name插入数据,此时的id会默认从100往后自增。因此通过上述展示,我们可以很好了解到表中的某字段主键设置为auto_increment后如果按照默认值自增的话,是按照最大值来往后自增的。 


1.6FOREIGN KEY约束

foreign key约束是关联两个或多个表之间结构的约束,我们可以根据需求设计相应的表结构。语法格式为:foreign key (字段名) references 主表(列)

因此发出关联的表我们称为子表,被关联的表我们称为父表。关联哪些字段也是根据你的需求来设定的,举两个例子:

创建一个班级表classes:

mysql> create table classes(-> id int primary key auto_increment-> );
Query OK, 0 rows affected (0.05 sec)

classes表的结构为:

mysql> desc classes;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.00 sec)

创建一个学生表student:

mysql> create table student(-> id int primary key auto_increment,-> name varchar(20) default '未填写',-> age int,-> sex varchar(10),-> classes_id int,-> foreign key (classes_id) references classes(id)-> );
Query OK, 0 rows affected (0.02 sec)

student表的结构为: 

mysql> desc student;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| name       | varchar(20) | YES  |     | 未填写  |                |
| age        | int(11)     | YES  |     | NULL    |                |
| sex        | varchar(10) | YES  |     | NULL    |                |
| classes_id | int(11)     | YES  | MUL | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

经过上述两个表的创建,此时两表之间的关系为:student为子表,classes为父表。这样的关系有什么作用呢?当我们想要对子表student进行增添数据或操作时,必须满足父表classes中的id存在。且student表在增添数据时,student中的classes_id必须与classes中的id完全相同。可能有些难理解,我们来看下方的例子与讲解。


当我往student这个空表里面增添一行数据时:

mysql> insert into student values(1,'张三',20,'男',101);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`classes_id`) REFERENCES `classes` (`id`))

出现了ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`classes_id`) REFERENCES `classes` (`id`))这条错误,这条错误的意思为: 错误1452(23000):不能添加或更新子行:外键约束失败(' test ')。 ' student ',约束' student_ibfk_1 '外键(' classes_id ')引用' classes ' (' id ')) 

因为student表中的classes_id连接了外键为classes表中的id,因此我们得保证classes表中的id存在的同时,才能增添数据到student表中。因此,我们应该这样写代码:

mysql> insert into classes(id) values-> (101),-> (102),-> (103);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> insert into student values(1,'张三',20,'男',101);
Query OK, 1 row affected (0.00 sec)

上述代码我们先对classes表插入数据后,再才能对student表中插入相应的数据。因此一个表通过外键连接其他表时候,那么这个表(前者)就是那个表(后者)的子表。在上述两表中,student作为子表,classes作为父表,所以student表要插入数据必需先满足父表中的相应数据。这就是FOREIGN KEY的作用!


当然,我们删除这个两个表中的数据时候也是有先后顺序的,我们必须得先删子表再删父表。

先删除父表中数据:

mysql> delete from classes;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`classes_id`) REFERENCES `classes` (`id`))

提示了错误:ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`. `student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`classes_id`) REFERENCES `classes` (`id`)) 意为:错误1451(23000):不能删除或更新父行:外键约束失败(' test ')。 ' student ',约束' student_ibfk_1 '外键(' classes_id ')引用' classes ' (' id ')) RAIN

当我们先删除子表中数据保证子表中没有数据关联父表时,这个时候就能删除父表中的数据了:

mysql> delete from student;
Query OK, 1 row affected (0.00 sec)mysql> delete from classes;
Query OK, 3 rows affected (0.00 sec)

可以看到上述代码正常的运行了,因此当我们想要设计复杂表结构时可以使用FOREIGN KEY这个外键约束。


注意,MySQL中的sql语句或者任何字段大小写不敏感,也就是你可以大写也可以小写,因此博主在举例的时一时是小写一时是大写这个不必在意。其次在MySQL实际的开发中不建议轻易的删除数据库或者全列查询数据库这样的操作是很危险的,我们可以在日常的学习或练习过程中可以安心使用这些指令,到了开发的时候可不敢轻易删库查库。

本期博文到这里就结束了,感谢你的耐心阅读。码文不易,如有收获还请给博主点个小小的关注。


http://chatgpt.dhexx.cn/article/1t0aLkrd.shtml

相关文章

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…

解决 Sublime Text 中文样式显示异常问题

目录 一、问题背景 二、问题解决 1)在工具栏中选择 Preferences → Settings ,打开配置文件 2)在右侧界面添加下方代码块中的内容, CtrlS 保存 三、效果展示 一、问题背景 最近在单位的Mac系统中使用Sublime Text感觉良好&a…

sublime text里面中文字体显示异常解决方案

sublime text下载之后一开始转成中文之后,会出现中文显示异常的问题,比如下图中“门”字显示异常 通过如下的设置可以解决该问题: 首选项--》设置 在该位置添加如下内容: {"font_options": ["gdi"],"dp…

Linux sublime设置中文,Sublime Text 3 设置为Ubuntu 14.04默认编辑器并支持中文

Ubuntu 14.04下设置Sublime Text 3支持中文输入 发现Sublime Text不支持中文,我用的是Fctix,查了好长时间教程搞定了,在此分享并记录下,最后附上本次所需文件的下载地址。 1、 复制如下的代码为sublime_imfix.c文件并放到sublime_…

sublime匹配汉字

需要处理的文本 GET/aaa/v1/xxx【门户】获取商机列表信息 POST/aaa/v1/xxx创建商机接口 POST/aaa/v1/xxx/approve审核渠道报备商机 GET/aaa/v1/xxx/areaSales根据区域编码获取对应的销售负责人(渠道经理) POST/aaa/v1/xxx/assign分派渠道报备商机 POST/aaa/v1/xxx/convert/ord…

解决SublimeText中文注释乱码

在使用Sublime Text过程中,出现文件中中文呈现乱码的情况 解决:安装Package Control --> 安装插件ConvertToUTF8 1. 安装Package Control 1)Preferences --> Browse Packages,进入打开上层目录,选择Installed…

Sublime 打开文件中文乱码

解决步骤: 1. Ctrl Shift P 打开命令行 2. 输入install Package Control ,点击进行安装 3. CTRLSHIFTP > 安装 Install Package 4. Install Package 安装完毕后,在弹出的命令行,输入ConvertToUTF8,点击进行安装…

Sublime中文乱码问题!今天星期四~

Sublime使用过程中,不知道为啥里面的中文注释全部变成了乱码!!!好生气! 问题描述 变成乱码之后我按照搜索的教程下载 Package Install,ConvertTOUTF-8,结果全都不行!! …

Sublime使用

文章目录 一、汉化二、修改字体三、总结 一、汉化 Sublime Text 4 软件本身是支持汉化的,但是需要安装插件,不需要再去找汉化包之类 首先我们需要调出命令面板:点击“Tools”-》Commadn Palette或者直接按下快捷键Ctrlshiftp调出 在调出的页面…

Sublime Text设置中文

1. 在Sublime Text中,主菜单栏选择Tools->Command Palette,或快捷键ShiftCtrlP,弹出命令面板: 2. 输入install,点击Instal Package Control 3. 稍等几秒,弹出提示:安装成功&#x…