MySql中表的约束

​ 本篇中将会介绍关于 MySql 数据库中的表的约束,关于表的约束其实约束的是表中的数据类型,因为有的数据类型很单一,需要我们添加一些额外的约束,才能更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,比如QQ号,要求是唯一的。

文章目录

      • 空属性NULL
      • 默认值
      • 列描述
      • zerofill
      • 主键
      • 自增长
      • 唯一键
      • 外键

空属性NULL

​ 对于空属性来说,包含两个值:null(通常默认是这个),not null

​ 数据库默认字段基本都是默认为null,但是在实际的开发中,需要我们尽可能的保证字段不为空,因为数据为空没办法保证参数运算。

mysql> select null;
+------+
| NULL |
+------+
| NULL |
+------+
1 row in set (0.00 sec)mysql> select null + 1;
+----------+
| null + 1 |
+----------+
|     NULL |
+----------+
1 row in set (0.00 sec)

​ 如上所示,当我们查找null时,出现的是null,查找null+1时,出现的还是null,null不会参与到运算中。

​ 如下,创建一个表中字段不为null的表,其中的属性也显示Null值为no,插入的时候也需要插入完整数据才可以:

mysql> create table class (-> class_name varchar(20) not null,-> class_room varchar(20) not null-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc class;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_name | varchar(20) | NO   |     | NULL    |       |
| class_room | varchar(20) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)mysql> insert into class(class_name) values('class1');
ERROR 1364 (HY000): Field 'class_room' doesn't have a default value

默认值

​ 默认值:当我们向表中插入某些个值的时候,没有指定哪列属性为什么值的时候,那么将会在该列中插入列默认的值,如下:

mysql> create table person (-> name varchar(20) not null,-> age tinyint unsigned default 0,-> sex char(2) default '男'-> );
Query OK, 0 rows affected (0.03 sec)mysql> desc person;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| name  | varchar(20)         | NO   |     | NULL    |       |
| age   | tinyint(3) unsigned | YES  |     | 0       |       |
| sex   | char(2)             | YES  |     | 男      |       |
+-------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)mysql> insert into person(name) values('张三');
Query OK, 1 row affected (0.00 sec)mysql> select * from person;
+--------+------+------+
| name   | age  | sex  |
+--------+------+------+
| 张三   |    0 | 男    |
+--------+------+------+
1 row in set (0.00 sec)

​ 如上我们创建的表中,age和sex就设置了对应的默认值,但同时我们还会发现其Null是为YES的,但是这并不妨碍直接插入的时候优先选择默认值

列描述

​ 列描述:comment,没有实际的含义,只是用来描述字段,会根据创建语句保存起来,便于之后查询表属性的时候区别列对应的含义。如下:

mysql> create table person (-> name varchar(20) not null comment '姓名',-> age tinyint unsigned default 0 comment '年龄',-> sex char(2) default '男' comment '性别'-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc person-> ;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| name  | varchar(20)         | NO   |     | NULL    |       |
| age   | tinyint(3) unsigned | YES  |     | 0       |       |
| sex   | char(2)             | YES  |     | 男      |       |
+-------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)mysql> show create table person\G;
*************************** 1. row ***************************Table: person
Create Table: CREATE TABLE `person` (`name` varchar(20) NOT NULL COMMENT '姓名',`age` tinyint(3) unsigned DEFAULT '0' COMMENT '年龄',`sex` char(2) DEFAULT '男' COMMENT '性别'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

​ 如上所示,使用desc查看表格的时候并不能看到注释信息,通过show可以查看。

zerofill

​ 我们在定义数字类型的时候(以int为例),通过show查看到关于int还有一个括号,如下:

mysql> show create table t1\G;
*************************** 1. row ***************************Table: t1
Create Table: CREATE TABLE `t1` (`a` int(10) unsigned DEFAULT NULL,`b` int(10) unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

​ 如上所示,int(10),这个10表示什么含义呢?这个10和zerofill属性有关,如下所示,将表中a的类型加上zerofill约束:

mysql> alter table t1 change a a int(5) unsigned zerofill;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> insert into t1 values(1, 2);
Query OK, 1 row affected (0.01 sec)mysql> select * from t1;
+-------+------+
| a     | b    |
+-------+------+
| 00001 |    2 |
+-------+------+
1 row in set (0.00 sec)

​ 如上所示,当我们将a的属性加上zerofill约束之后,显示出的值就在前面多出了四个0,这是因为zerofill的作用就是设定值的宽度,当宽度小于设定宽度的时候,自动填充0。但其实zerofill只是格式化输出了对应的变量,其本质还是int类型,当我们使用十六进制输出a值的时候,就不会显示出多余的0了,如下:

mysql> select a, hex(a) from t1;
+-------+--------+
| a     | hex(a) |
+-------+--------+
| 00001 | 1      |
+-------+--------+
1 row in set (0.00 sec)

主键

​ 主键:primary key用来唯一的约束该字段里面的数据,一张表中最多只能有一个主键并且主键中的值不能重复。(主键所在列通常是整数类型)

​ 创建表的时候直接在该字段上指定主键,如下:

mysql> create table t2 (-> id int unsigned primary key comment '学号不能为null',-> name varchar(20) not null-> );
Query OK, 0 rows affected (0.01 sec)mysql> desc t2;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(10) unsigned | NO   | PRI | NULL    |       |
| name  | varchar(20)      | NO   |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

​ 主键约束:主键对应字段中不能重复,一旦重复就会操作失败,如下:

mysql> insert t2 values (1, '张三');
Query OK, 1 row affected (0.00 sec)mysql> insert t2 values (1, '李四');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

​ 删除主键与向表中追加主键,语法如下:

alter table table_name drop primary key;
alter table table_name add primary key(字段列表);
mysql> alter table t2 drop primary key;
Query OK, 1 row affected (0.04 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> alter table t2 add primary key(id);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

复合主键:创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用重复主键,如下:

mysql> create table t3 (-> id int unsigned,-> course char(10) comment '课程代码',-> score tinyint unsigned default 10 comment '成绩',-> primary key(id ,course)-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc t3;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| id     | int(10) unsigned    | NO   | PRI | NULL    |       |
| course | char(10)            | NO   | PRI | NULL    |       |
| score  | tinyint(3) unsigned | YES  |     | 10      |       |
+--------+---------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)mysql> insert into t3 (id, course) values (1, '123');
Query OK, 1 row affected (0.00 sec)mysql> insert into t3 (id, course) values (1, '123');
ERROR 1062 (23000): Duplicate entry '1-123' for key 'PRIMARY'

自增长

​ auto_increment:当对应的字段不给值的时候,会自动的被系统触发,系统会从当前字段中已经有的最大值进行加一操作,得到一个新的不同的值。(通常和主键搭配使用,作为逻辑主键)

mysql> create table t4 (-> id int unsigned primary key auto_increment,-> name varchar(10) not null default ''-> );
Query OK, 0 rows affected (0.02 sec)mysql> insert into t4 (name) values ('a');
Query OK, 1 row affected (0.00 sec)mysql> insert into t4 (name) values ('b');
Query OK, 1 row affected (0.00 sec)mysql> select * from t4;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
+----+------+
2 rows in set (0.00 sec)

​ 在插入之后获取上次插入的auto_increment的值(若是批量插入后获取的是第一个值),如下:

mysql> select last_insert_id() from t4;
+------------------+
| last_insert_id() |
+------------------+
|                2 |
|                2 |
+------------------+
2 rows in set (0.00 sec)

​ 索引:在关系数据库中,索引是一种单独的、物理的对数据库表中一列或者多列的值进行排序的一种存储结构,他是表中某一列或者若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相对于图书的目录,可以根据目录中的页码快速找到所需的内容。

​ 索引提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。数据库使用索引找到特定的值,然后顺着指针找到包含在该值的行。这样可以使得对应于表的SQL语句执行得更快,可以快速访问数据库表中的特定信息。

唯一键

​ 一张表中往往有很多的字段需要唯一性,数据不能重复,但是一张表中只能有一个主键;唯一键就可以解决表中有多个字段需要唯一性约束的问题。

​ 唯一键的本质和主键差不多,唯一键允许为空,而且允许多个为空,所以唯一键对于空值不做唯一键约束。

​ 唯一键和主键的区别:主键更多是标识唯一性的,而唯一键更多是保证在业务上,不要和别的信息出现重复。(比如我们使用的身份证可以是作为唯一标识我们的主键,但是我们在学校中也有对应的学号用来唯一的标识我们,学校并不会直接使用身份证来唯一的标识我们)

mysql> create table student (-> id char(10) unique comment '学号,不能重复但可以为null',-> name varchar(20)-> );
Query OK, 0 rows affected (0.02 sec)mysql> insert into student (id, name) values ('01', 'zhangsan');
Query OK, 1 row affected (0.00 sec)mysql> insert into student (id, name) values ('01', 'lisi');
ERROR 1062 (23000): Duplicate entry '01' for key 'id'
mysql> insert into student (id, name) values (null, 'lisi');
Query OK, 1 row affected (0.00 sec)mysql> select * from student;
+------+----------+
| id   | name     |
+------+----------+
| 01   | zhangsan |
| NULL | lisi     |
+------+----------+
2 rows in set (0.00 sec)

外键

​ 外键用于定义主表和从表之间的关系:外键约束组合要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键之后,要求外键列数据必须在主表的主键列存在或者为null。

​ 语法:

foreign key (字段名) references 主表(列)

​ 如下所示:
在这里插入图片描述
​ 如上图所示,假若我们将班级表中的数据都设计在每个学生表的后面,那么就会出现数据冗余,所以我们只需要设计成让 stu->class_id class->id,这样形成关联的关系,这就是外键约束

​ 对上图进行设计:

// 主表
mysql> create table class ( id int primary key, name varchar(30) not null comment '班级名' );
Query OK, 0 rows affected (0.02 sec)// 从表
mysql> create table stu (-> id int primary key,-> name varchar(30) not null comment '学生名',-> class_id int,-> foreign key (class_id) references class(id)-> );
Query OK, 0 rows affected (0.02 sec)

​ 插入数据:

mysql> insert into class values (10, '数学分析'), (20, '计算机网络');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> insert into stu values (100, 'zhangsan', 10), (101, 'lisi', 20);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> insert into stu values (102, 'wangwu', 30);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))mysql> insert into stu values (102, 'wangwu', null);
Query OK, 1 row affected (0.00 sec)

​ 如上所示,想要正常的插入数据,具有外键约束的变量只能插入合法的值或者null值,若插入的数据不为null且外键约束中没有这个值,那么就会插入失败。

​ 外键约束的存在更加严格的让我们遵循数据之间的关联性,只要是存在关联的数据,就必须遵守外键约束,这样可以很好的防止出现异常数据。(比如当我们在学校对学生数据进行管理,设立外键约束就不会出现学生所属班级是不存在的班级的情况)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456272.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Notepad++通过自定义语言实现日志按照不同级别高亮

借助Notepad的自定义语言可以实现日志的按照不同级别的高亮&#xff1b; 参考&#xff1a; https://blog.csdn.net/commshare/article/details/131208656 在此基础上做了一点修改效果如下&#xff1a; xml文件&#xff1a; <NotepadPlus><UserLang name"Ansibl…

leetCode算法题爬楼梯递归写法

题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2输出&#xff1a;2解释&#xff1a;有两种方法可以爬到楼顶。1. 1 阶 1 阶2. 2 阶 …

GPIO输入和输出

参考视频&#xff1a;2.1 [GPIO]4种输出模式_哔哩哔哩_bilibili 输出&#xff1a;通过写0或者写1&#xff0c;控制引脚输出低电压或高电压。 输入&#xff1a;通过读取引脚是0还是1&#xff0c;判断引脚输入的是高电压还是低电压。 输出 推挽开漏通用通用输出推挽通用输出开漏…

Asp.net Core MVC 动态路由

动态路由 asp.net core 3.0 就支持了 // 映射关系public class TranslationDatabase{private static Dictionary<string, Dictionary<string, string>> Translations new Dictionary<string, Dictionary<string, string>>{{"en", new Dictio…

yolo自动化项目实例解析(八)自建UI-键鼠录制回放

项目中关于键鼠的操作&#xff0c;不像我们之前自动化那样一步一步去定义的&#xff0c;而是用C写了一个记录键鼠的操作&#xff0c;通过回放的方法来实现的 一、通讯系统 1、创建websocket服务器 首先通过事件循环asyncio 和websockets&#xff0c;创建一个持久化的服务端进程…

通过页面添加国际化数据,实现vue的国际化

element ui 写在前面1. 原有的vue的国际化处理1.1 语言文件1.2 lang的index.js1.3 入口文件导入1.3 应用 2. 通过页面添加国际化数据2.1 做法2.2 lang的index.js文件修改2.3 需要注意的点 总结写在最后 写在前面 需求&#xff1a;在系统的国际化管理页面添加国际化数据&#x…

我想电脑批量管理 30 台苹果手机,怎么操作更简单方便呢?

在如今的数字化时代&#xff0c;手机已经成为了我们日常生活中不可或缺的一部分。无论是工作还是娱乐&#xff0c;我们都需要使用各种各样的应用软件来满足自己的需求。 而对于那些需要管理大量苹果手机设备的企业来说&#xff0c;如何高效地完成这些任务就成了一个重要问题。…

三款计算服务器配置→如何选择科学计算服务器?

科学计算在众多领域都扮演着关键角色&#xff0c;无论是基础科学研究还是实际工程应用&#xff0c;强大的计算能力都是不可或缺的。而选择一台合适的科学计算服务器&#xff0c;对于确保科研和工作的顺利进行至关重要。 首先&#xff0c;明确自身需求是重中之重。要仔细考虑计算…

六个方向比较分析:ChatGPT-o1-preview与 ChatGPT-4o在论文写作辅助上的差异

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术研究和论文撰写的领域&#xff0c;人工智能助手正变得越来越重要。随着技术的不断进步&#xff0c;ChatGPT-o1-preview和ChatGPT-4o作为两个先进的语言模型&#xff0c;在辅助论文…

文件上传漏洞及安全

文件上传 文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题&#xff0c;对于如何确保这类安全问题&#xff0c;一般会从原生态功能中的文件内容&#xff0c;文件后缀&#xff0c;文件类型等方面判断&#xff0c;但是漏洞可能不仅在本身的代码…

C++学习路线(二十二)

构造函数 构造函数作用 在创建一个新的对象时&#xff0c;自动调用的函数&#xff0c;用来进行“初始化”工作:对这个对象内部的数据成员进行初始化。 构造函数特点 1.自动调用(在创建新对象时&#xff0c;自动调用) 2.构造函数的函数名&#xff0c;和类名相同 3.构造函数…

Pytorch学习--如何下载及使用Pytorch中自带数据集,如何把数据集和transforms联合在一起使用

一、标准数据集使用 pytorch官网–标准数据集 这里以CIFAR10数据集为例&#xff1a;CIFAR10 下载数据集 代码&#xff1a; import torchvision train_datatorchvision.datasets.CIFAR10(root"datasets",trainTrue,downloadTrue) test_datatorchvision.datasets.…

盘古信息制造数字化优才计划 | 解决人才困境 赋能智能制造

在中国制造2025的大背景下&#xff0c;制造业正以前所未有的速度向数字化、智能化转型。在这场深刻的变革中&#xff0c;人才作为核心驱动力&#xff0c;其重要性日益凸显。作为全球领先的制造运营管理工业软件供应商&#xff0c;盘古信息深知构建制造人才生态的重要性&#xf…

EasyExcel_动态表头的导入导出

文章目录 前言一、EasyExcel二、使用步骤1.引入jar包2.数据准备2.1 数据库 3.方法实例3.1 无实体的导入3.1.1 Controller3.1.2 Service3.1.3 Listener3.1.4 Utils3.1.5 无实体导入数据返回说明 3.2 无实体的导出3.2.1 无实体导出数据(这里只贴出关键代码,Service代码处理)3.2.2…

Kafka Tool(Offset Explorer)在windows下配置访问kerberos认证Kafka

Author : Spinach | GHB Link : http://blog.csdn.net/bocai8058文章目录 前言准备配置文件配置软件参数及启动 前言 Offset Explorer&#xff08;以前称为Kafka Tool&#xff09;是一个用于管理和使用Apache Kafka集群的图形用户界面&#xff08;GUI&#xff09;应用程序。…

登录时用户名密码加密传输(包含前后端代码)

页面输入用户名密码登录过程中&#xff0c;如果没有对用户名密码进行加密处理&#xff0c;可能会导致传输过程中数据被窃取&#xff0c;就算使用https协议&#xff0c;在浏览器控制台的Request Payload中也是能直接看到传输的明文&#xff0c;安全感是否还是不足。 大致流程&a…

FreeRTOS代码规范(3)

数据类型 portmacro.h : 在里面定义了Free RTOS 用到的相关数据类型 在 CM-3 内核中 short类型是16位&#xff0c;long 类型是32位 在 portmacro.h 中有两个最基本的数据类型 &#xff1a; Base type_t Tick type_t 这两个数据类型的存在是基于执行效率考虑的&#xff0c;…

如何使用 NumPy 和 Matplotlib 进行数据可视化

如何使用 NumPy 和 Matplotlib 进行数据可视化 在数据科学领域&#xff0c;NumPy 和 Matplotlib 是 Python 中最常用的两个库。NumPy 用于科学计算和数据处理&#xff0c;而 Matplotlib 提供了丰富的图表工具来展示数据。本文将介绍如何将这两个库结合使用&#xff0c;轻松进行…

腾讯会议pc端3.29.11开启悬浮窗口

之前是&#xff1a;pc端每次最小化&#xff0c;它就自动收回到任务栏里了 版本&#xff1a;3.29.11 解决办法&#xff1a; 打开腾讯会议&#xff0c;点击左上角的【头像】。 单击【设置】。 选择【显示当前说话者】来管理麦克风浮窗。 再进入会议&#xff0c;点击最小化一哈&…

中小企业设备资源优化:Spring Boot系统实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…