MySQL数据库,数据的约束

news2024/11/27 20:36:15

目录

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: 0

mysql> 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://www.coloradmin.cn/o/423493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3中shallowRef和shallowReactive的使用?

shallowRef 和 shallowReactive前言shallowRef 和 shallowReactive概述区别shallowReactiveshallowRef总结:注意为什么使用shallowRef和shallowReactive?我们在之前的博客进过 ref 函数和 reactive 函数,他们的作用是将数据转换成响应式的数据…

真空压力控制方法在X射线探测器窗口薄膜材料力学性能测试中的应用

摘要:针对X射线窗口膜材料机械性能测试中对真空度和高压压力的准确控制需要,本文提出了相应的解决方案。解决方案中采用了薄膜电容真空计、压力传感器、电动针阀、压力调节阀和真空压力PID控制器,与真空泵和高压气源配合,可在膜材…

5Element

一、Element-快速入门 1、安装ElementUi组件库 输入npm install element-ui2.15.3 2、引入ElementUi组件库 https://element.eleme.cn/#/zh-CN/component/quickstart //引入element-ui import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css;Vue.…

Java魔法类 Unsafe应用解析

前言 Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Ja…

【Linux】man什么都搜不了,No manual entry for xxx的解决方案

本文首发于 慕雪的寒舍 man什么都搜不了,No manual entry for xxx的解决方案 系统 CentOS 7.6 1.问题描述 今天查手册的时候,发现man什么都查不了。不管是系统接口还是函数,都显示没有入口文档(No manual entry for)…

狂追ChatGPT:开源社区的“平替”热潮

目前,不少优质的类ChatGPT模型都只能通过API接入,而一些开源LLM的效果与ChatGPT相比差距不小。不过,近期开源社区开始密集发力了。 其中,Meta的LLaMA模型泄漏是开源“ChatGPT”运动的代表性事件。基于LLaMA模型,开源社…

条款08: 别让异常逃离析构函数

文章目录背景知识析构函数背景知识 下面是一段测试代码&#xff1a; class Test { public:Test(int para){m_num para;};void test_throw(){throw(3);};~Test() {cout<<"delete Test"<<m_num<<endl;//test_throw();};int m_num; }; int main() …

牛客乔迁新居,新址在……

有个好消息想向大家公布&#xff1a;牛客&#xff08;上海办公室&#xff09;搬家啦&#xff01; 自3月27日起&#xff0c;牛客&#xff08;上海办公室&#xff09;正式乔迁至上海市长宁区长宁路999号兆丰广场办公楼G层G15。新的办公室坐落在上海长宁区的中心地带&#xff0c;…

Talk预告 | 浙江大学特聘研究员廖依伊:面向自动驾驶仿真平台的神经渲染

本期为TechBeat人工智能社区第477期线上Talk&#xff01; 北京时间3月1日(周三)20:00&#xff0c;浙江大学信电学院特聘研究员——廖依伊的Talk将准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “面向自动驾驶仿真平台的神经渲染”&#xff0c;届时将探…

VSCode 配置PyQt5 开发环境

前提要求&#xff1a;Windows 安装Anaconda。 如果没有安装&#xff0c;请参考文章:Windows安装Anaconda使用教程 1、PyQt 5 安装 在配置python环境的时候需要注意&#xff0c;PyQt5需要python 3.5以上的版本&#xff0c;在python环境中(conda、pipenv)安装pyqt5相关组件Py…

4.13(LoadLibrary)

接着之前预习的知识&#xff0c;我观察的自己编译出来的bin LoadLibraryExA LoadLibraryExA函数进去&#xff0c;现时用RtInitAnsiString函数初始化了ANSI的计数字符串&#xff0c;底层是调用了LoadLibraryExW函数&#xff0c;在LoadLibrarExW函数里做了unicode的计数字符串的…

分子生物学 第三章 基因、基因组及基因组学

文章目录第三章 基因、基因组及基因组学第一节 基因1 基因认识的三个阶段2 基因的特征(1)跳跃基因(2)断裂基因3 基因的分类4 基因的结构5 基因的大小6 基因的数目第二节 基因组1 基因组的概念2 噬菌体基因组3 细菌基因组以大肠杆菌(原核生物的代表)为研究对象4 酵母基因组以酵母…

Python之拯救Xubuntu22.04误删/usr/bin/python3.10(二十二)

0.首先删除/usr/bin/python3.10,会导致以下错误: <1>.报错1: ModuleNotFoundError: No module named ‘apt_pkg’ <2>.报错2: bash: /usr/lib/command-not-found: /usr/bin/python3: 解释器错误: 没有那个文件或目录 <3>.报错3: 通过亲身操作,以下步骤可…

【Linux】来写一个tcp的服务端+客户端

本文首发于 慕雪的寒舍 今天让我们来写一个tcp的服务器/客户端代码。 完整代码见我的gitee 链接 阅读本文前&#xff0c;建议先阅读&#x1f449; udp服务器 由于本文采用自建图床&#xff0c;CSDN可能因带宽不够&#xff0c;出现外链图片缓存失败。 1.基本框架 tcp的服务器…

walt 调度算法

Walt 算法 WALT负载统计原理_walt算法_森森浅浅笙笙的博客-CSDN博客 CPU负载均衡之WALT学习【转】_mb5fdcad0be2e90的技术博客_51CTO博客 1、A task’s demand is the maximum of its contribution to the most recently completed window and its average demand over the p…

webgl-attribute、uniform、varying三者的区别

通用js: let canvas document.getElementById(webgl) canvas.width window.innerWidth canvas.height window.innerHeight let ctx canvas.getContext(webgl) attribute&#xff1a; 范围: 只适用于vertexShader&#xff0c;将js代码中的数据传递给vertexShader。 使用方…

知识图谱扩充|蜕变测试|蜕变关系

目录 前言&#xff1a;概念定义 什么是蜕变测试&#xff1f; 那么&#xff0c;怎么进行蜕变测试呢&#xff1f; 1. 生成蜕变关系 a 等价关系 b 混排关系 c 交集关系 d 并集关系 2. 生成蜕变用例 3. 执行蜕变用例 4. 校验蜕变关系 学术报告 一、蜕变测试MT 二、蜕变…

【id:32】【20分】B. Date(类与构造)

题目描述 下面是一个日期类的定义&#xff0c;请在类外实现其所有的方法&#xff0c;并在主函数中生成对象测试之。 注意&#xff0c;在判断明天日期时&#xff0c;要加入跨月、跨年、闰年的判断 例如9.月30日的明天是10月1日&#xff0c;12月31日的明天是第二年的1月1日 2月…

vue2路由(下)

编程式路由导航 通过点击按钮实现push和replace俩种模式的跳转 实现&#xff1a;就是通过$router原型里面的方法 也能实现路由的跳转和后退&#xff0c;分别采用的是$router里面的black和forward方法 感觉就是BOM对象中的history对象里面的方法 正是前进&#xff0c;后是后…

快鲸scrm | 三个步骤,快速打造企业长效私域营销阵地

快鲸scrm对企业微信私域流量玩法进行系统梳理&#xff0c;把企业微信用户运营拆解为“获客”、“转化”和“服务”这三个关键步骤&#xff0c;从点到面&#xff0c;为企业私域运营提供可行性的解决方案。 一、构建私域流量管理机制 用户是企业发展的基础&#xff0c;用户增长对…