【半夜学习MySQL】表的约束(含主键、唯一键、外键、zerofill、列描述、默认值、空属性详解)

在这里插入图片描述

🏠关于专栏:半夜学习MySQL专栏用于记录MySQL数据相关内容。
🎯每天努力一点点,技术变化看得见

文章目录

  • 前言
  • 空属性
  • 默认值
  • 列描述
  • zerofill
  • 主键
    • 主键概述
    • 主键删除与追加
    • 复合主键
  • 自增长
  • 唯一键
  • 外键
  • 综合案例


前言

上一篇文章中介绍了数据类型,数据类型已经对字段做出一定的约束。但是数据类型的约束很单一,需要一些额外的约束,更好的保证数据的合法性,让我们未来插入数据库表中的数据是复合预期的,保证数据在业务逻辑角度的正确性。本文将介绍表的其他约束,如null/not null、default、comment、zerofill、primary key、auto_increment、unique key等

约束本质是通过技术手段,倒逼程序员,插入正确的数据,反过来,站在mysql的视角,凡是插入进来的数据,都是符合数据约束的!

约束的最终目标:保证数据的完整性和可预期性。

空属性

特点介绍
空属性包含两个取值:null和not null,其中字段没有任何约束时,默认自动填null。

★ps:数据库字段在默认情况都填空,但是实际开发时,尽可能保证数据不为空,因为数据为空没办法参与运算。↓↓↓
在这里插入图片描述
案例:
创建一张班级表,包含班级名和班级所在教室号。要求班级名不可以为空,但班级所在教室可以为空(有可能某些班级的教室暂未被安排)

所以我们在设计数据表时,需要对班级名字段做出约束,不满足要求的数据将无法插入表中,也就是约束↓↓↓

create table class_info(
class_name varchar(10) not null,
class_loc varchar(12)
);
desc class_info;

在这里插入图片描述

insert into class_info values('软件1班', '理工一号楼429');
insert into class_info values('软件4班', null);
insert into class_info values(null, null);

在这里插入图片描述
★ps:由于class_name设置了not null约束,只要插入的数据该字段为null,mysql将拒绝插入。

★ps:NULL与""(空串)含义不同。

默认值

特点介绍
某些字段的值经常性的会出现某个具体的值,我们可以给该字段设置一个默认的值,在需要填写真实数据时,用户可以选择性的使用默认值。
案例:
程序员相亲网站需要一个用户信息表,包含用户姓名、性别和年龄,其中,性别默认值为’男’,年龄默认值为0。↓↓↓

create table user(
name varchar(32) not null,
gender varchar(2) default '男',
age tinyint unsigned default 0
);
desc user;

在这里插入图片描述

insert into user values('小明', '男', 18);
insert into user(name, gender) values('小雅', '女');
insert into user(name) values('小光');
select * from user;

在这里插入图片描述
★ps:在没有给字段指定数值时,会使用默认值填充。只有设置了default的列,才可以在插入数据的时候,对该列进行省略。

★ps:default和not null不冲突,而是互相补充的。当用户设置了默认值,且不能为null时,用户如果没有插入数据,则会使用用默认值;用户如果插入null,则会报错。
在这里插入图片描述

列描述

特点介绍
关键字为comment,列描述没有实际的含义,它专门用来描述字段,会保存在表创建语句中,主要用于程序员或DBA了解字段含义。
案例:
下面创建一张学生表,并对每个字段给出列描述↓↓↓

create table stu(
id int not null comment '学号',
name varchar(32) not null comment '姓名',
age tinyint unsigned default 0 comment '年龄',
gender char(2) default '男' comment '性别'
);
desc stu;

在这里插入图片描述
★ps:从上图可知,desc查看不到注释信息。如果想查看表的注释信息,需要通过show创建表的语句↓↓↓

show create table stu;
show create table stu \G

在这里插入图片描述
★ps:如果使用show查看时,格式比较杂乱,可以通过在结尾带上\G,对输出结果格式化。

zerofill

特点介绍
在之前的文章中介绍到,表中某些字段类型为int(11),这个11是什么含义呢?首先我们创建一个包含int字段的表,并添加zerofill约束↓↓↓

create table TestZerofill(
num int(5) zerofill
);
desc TestZerofill;

在这里插入图片描述
此时对该表中插入数据↓↓↓

insert into TestZerofill values(33);
insert into TestZerofill values(888);
insert into TestZerofill values(123456789);

在这里插入图片描述
★ps:从上面结果可知,当字段设置为int(5)时,如果数字个数不足5个,则会在数字前补0,使得数字个数为5个;如果数字个数超过5个,则按实际数据显式。

下面我们对表格中的数据进行查询↓↓↓

select * from TestZerofill where num=33;
select * from TestZerofill where num=888;
select * from TestZerofill where num=123456789;

在这里插入图片描述
★ps:zerofill只约束了字段显式时的格式,并不影响数据本身,我们仍可以使用原先插入的数据进行查询操作。

主键

主键概述

特点介绍
primary key用来唯一标识表中的数据,被设置为主键的列,不能重复,不能为空。一张表中最多只能有一个主键;主键所在列通常是整数类型。
案例:
创建某个幼儿园的小朋友的信息表,将学生id设置为主键,名字字段不能为空↓↓↓

create table child_info(
id int unsigned primary key comment '学号',
name varchar(32) not null comment '姓名'
);
desc child_info;

在这里插入图片描述
下面我们对该表插入数据↓↓↓

insert into child_info values(1,'a');
insert into child_info values(1,'b');

在这里插入图片描述
★ps:主键对应的字段不能出现重复值,一旦重复,mysql将拒绝插入。

主键删除与追加

删除主键

alter table 表名 drop primary key;

示例:

desc child_info;
alter table child_info drop primary key;
desc child_info;

在这里插入图片描述
追加主键
当表创建以后但是没有没有主键的时候,可以再次追加主键

desc child_info;
alter table child_info add primary key(id);
desc child_info;

在这里插入图片描述

复合主键

在创建表的时候,可以在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,则称为复合主键。例如:公寓号+寝室号+床号才能确定一个唯一的一个学生,则公寓号、寝室号、床号一同组成了复合主键。
案例:
创建一张寝室信息表↓↓↓

create table hotel(
loc_id char(2) not null comment '公寓号',
room_id char(3) not null comment '宿舍号',
bed_id char(1) not null comment '床号',
name varchar(32) comment '学生姓名',
primary key(loc_id, room_id, bed_id)
);
desc hotel;

在这里插入图片描述
★ps:上图中loc_id、room_id、bed_id字段被标为主键,并不表示这三个字段分别是主键,而是这三个字段一同构成了一个主键。

下面尝试插入数据↓↓↓

insert into hotel values('12', '321', '8', '小明');
insert into hotel values('12', '321', '2', '小张');
insert into hotel values('02', '321', '2', '小光');
insert into hotel values('02', '321', '2', '小乐');

在这里插入图片描述
★ps:只有公寓号、宿舍号、床号组成的主键完全相同时,才会触发主键的唯一性约束。

自增长

特点介绍
当某个字段被设置为auto_increment,插入数据时,该字段如果不直接给值,系统会自动将该字段设置为自增默认值+1(每添加一次数据,自增默认值将自增1)。通常和主键搭配使用,作为逻辑主键。

自增长的特点:
● 任何一个字段要做自增长,前提是该字段本身是一个索引(desc 表名时,对应key一栏有值,表示该列有索引);
●自增长字段类型必须是整数;
●一张表最多只能有一个自增长。
案例:
创建一张会员表,会员编号每次自增1↓↓↓

create table vip(
id int unsigned primary key auto_increment,
name varchar(32) not null
);
desc vip;

在这里插入图片描述
对该表插入数据↓↓↓

insert into vip(name) values('小明');
insert into vip(name) values('小光');
insert into vip(name) values('小翔');
select * from vip;

在这里插入图片描述
在插入后,可以通过select last_insert_id();获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)
在这里插入图片描述
如果在vip表插入id为1000的会员,后序插入的需要,将在该基础上自增↓↓↓

insert into vip(id, name) values(1000, 'xiao ming');
insert into vip(name) values('xiao guang');
insert into vip(name) values('xiao xiang');
select * from vip;

在这里插入图片描述

★ps:关于索引:
●在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
●索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
●索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。
●数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
关于索引的更多细节,将于后序文章介绍

唯一键

特点介绍:
一张表中往往有很多字段需要唯一性约束,即某个字段的数据不能重复。但是一张表中只能有一个主键,此时,唯一键就可以解决表中有多个字段需要唯一性约束的问题。

唯一键和主键差不多,但唯一键允许字段中的数据为空,且可以是多个数据为空,空字段将不参与唯一性比较。

★ps:主键和唯一键的区别:主键更多的是标识数据的唯一性。而唯一键更多的是保证在业务上,不要和别的信息出现区别。关于它们的区别,可以在下述案例中体会出来↓↓↓

案例:
创建一张员工信息表,包含员工的员工id(设为主键),员工姓名(不能为空),员工电话号码(允许为空,但必须唯一,即设置为唯一键)↓↓↓

create table woker(
id int unsigned primary key comment '员工号',
name varchar(32) not null comment '姓名',
phone char(11) unique comment '电话'
);
desc woker;

在这里插入图片描述
此时向该表插入数据↓↓↓

insert into woker values(1000, '小明', 18800444111);
insert into woker values(1001, '小光', 18800444222);
insert into woker values(1002, '小翔', null);
insert into woker values(1003, '小天', null);
insert into woker values(1004, '小仔', 18800444222);

在这里插入图片描述
★ps:从上图可知,设为唯一键的字段无法插入相同的数据,但可以插入多个值为null的数据。

外键

特点介绍:
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:

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

案例:
如果此时有一张学生表(包含学生id、姓名、性别、班级id),一张班级表(包含班级id、班级名称、班级教室)。需要使得这两个表产生关联,因为学生所在的班级的id必须存在于班级表中。一个学生不能归属于一个不存在的班级id。
在这里插入图片描述
下面先创建班级表↓↓↓

create table class(
class_id int unsigned primary key,
class_name varchar(12) not null,
class_loc varchar(12) unique
);
desc class;

在这里插入图片描述
此时在班级表中插入数据↓↓↓

insert into class values(1001, '软件1班', '理工一429');
insert into class values(1002, '软件2班', '理工一431');
insert into class values(1003, '计科1班', '科学楼321');
select * from class;

在这里插入图片描述
创建学生表,并使班级id为class表class_id的外键↓↓↓

create table student(
id int unsigned primary key,
name varchar(32) not null,
gender char(2) not null,
class_id int unsigned,
foreign key (class_id) references class(class_id)
);
desc student;

在这里插入图片描述
此时向学生表中插入数据↓↓↓

insert into student values(20001, '小明', '男', 1001);
insert into student values(20002, '小光', '男', null);
insert into student values(20003, '小项', '女', 4321);

在这里插入图片描述
★ps:外键可以是class表中class_id字段的任意值,也可以为空。但是不能是class_id以外的值。

综合案例

jammingrpo开了一家无人自助超市,配套的软件需要三张表,要求如下:
●商品表goods

字段名称 =>goods_idgoods_nameunitpricecategoryprovider
字段解释 =>商品编号商品名单价商品类别供应商

●客户表customer

字段名称 =>customer_idnameaddressemailsexcard_id
字段解释 =>客户号姓名住址邮箱性别身份证

●购买purchase

字段名称 =>order_idcustomer_idgoods_idnums
字段解释 =>订单号客户号商品号购买数量

要求如下:
●每个表都设置合适的主键及外键
●客户的名字不能为空值
●邮箱不能重复
●客户的名别只能是男、女或保密

下面创建的表是商品表↓↓↓

create table if not exists goods(
goods_id int unsigned primary key auto_increment comment '商品编号',
goods_name varchar(36) not null comment 
'商品名称',
unitprice decimal not null default 0 comment '单价',
caregory varchar(12) comment '商品分类',
privider varchar(12) comment '供应商'
);
desc goods;

在这里插入图片描述
下面创建的是客户表↓↓↓

create table if not exists customer(
customer_id int unsigned primary key auto_increment comment '客户编号',
name varchar(32) not null comment '客户姓名',
address varchar(256) comment '客户地址',
email varchar(64) unique key comment '电子邮箱',
gender enum('男', '女', '保密') not null comment '性别',
char_id char(18) unique key comment '身份证号'
);
desc customer;

在这里插入图片描述
最后创建的是购买表↓↓↓

create table if not exists purchase
(
order_id int unsigned primary key auto_increment comment '订单号',
customer_id int unsigned comment '客户编号',
goods_id int unsigned comment '商品编号',
nums int unsigned default 0 comment '购买数量',
foreign key (customer_id) references customer(customer_id),
foreign key (goods_id) references goods(goods_id)
);
desc purchase;

在这里插入图片描述
大家可自行插入数据进行测试

🎈欢迎进入半夜学习MySQL专栏,查看更多文章。
如果上述内容有任何问题,欢迎在下方留言区指正b( ̄▽ ̄)d

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android性能:高版本Android关闭硬件加速GPU渲染滑动卡顿掉帧

Android性能&#xff1a;高版本Android关闭硬件加速GPU渲染滑动卡顿掉帧 如果在Androidmanifest.xml配置&#xff1a; <application android:hardwareAccelerated"false" > 或者某个特点View使用代码&#xff1a; myView.setLayerType(View.LAYER_TYPE_SOFT…

带你手撕红黑树! c++实现 带源码

目录 一、概念 二、特性 三、接口实现 1、插入 情况一&#xff1a;p为黑&#xff0c;结束 情况二&#xff1a;p为红 1&#xff09;叔叔存在且为红色 2&#xff09;u不存在/u存在且为黑色 &#xff08;1&#xff09;p在左&#xff0c;u在右 &#xff08;2&#xff09;…

爱分析基于杭州云器Lakehouse实现成本最优的一体化管理,新一代数据平台的建设方式

导读 1.当前&#xff0c;企业在大数据和数据中台建设上取得成果&#xff0c;但数据开发管理仍具挑战性&#xff08;成本、效率、复杂度&#xff09;。 2.随数据平台领域成熟&#xff0c;厂商应结合自身需求&#xff0c;重新思考“基于开源自建数据平台”的重资产模式与“购买…

Windows单机部署RocketMQ5.X并与SpringBoot集成

RocketMQ 5.X下载 《RocketMQ 5.X下载》 下载后&#xff0c;解压缩 修改初始内存 修改runserver.cmd&#xff08;Linux则为runserver.sh&#xff09; 将下面的-Xms2g -Xmx2g -Xmn1g调小 if %JAVA_MAJOR_VERSION% lss 17 (set "JAVA_OPT%JAVA_OPT% -server -Xms2g -X…

传感网应用开发教程--AT指令访问新大陆云平台(ESP8266模块+物联网云+TCP)

实现目标 1、熟悉AT指令 2、熟悉新大陆云平台新建项目 3、具体目标&#xff1a;&#xff08;1&#xff09;注册新大陆云平台&#xff1b;&#xff08;2&#xff09;新建一个联网方案为WIFI的项目&#xff1b;&#xff08;3&#xff09;ESP8266模块&#xff0c;通过AT指令访问…

计算机毕业设计python校园二手交易系统aqj3i-

什么叫三层架构呢&#xff1f;指的是表示层、组件层、数据访问层。组件层是双层架构没有的&#xff0c;它的加入&#xff0c;把复杂的问题分解得更简单、明了&#xff0c;通过组件层&#xff0c;实现控制数据访问层&#xff0c;这样达到功能模块易于管理、易于访问等目的&#…

【python量化交易】qteasy使用教程06——创建自定义因子选股交易策略

创建自定义因子选股策略 使用qteasy创建自定义因子选股交易策略开始前的准备工作本节的目标Alpha选股策略的选股思想计算选股指标用FactorSorter定义Alpha选股策略交易策略的回测结果用GeneralStg定义一个Alpha选股策略回测结果&#xff1a;本节回顾 使用qteasy创建自定义因子选…

【UnityRPG游戏制作】Unity_RPG项目_PureMVC框架应用

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

Redis系列-3 Redis缓存问题

1.缓存的作用 数据库(如Mysql)的持久化特点带来了较低的性能&#xff0c;高并发的场景下&#xff0c;连接池很快被耗尽而出现宕机或DOS&#xff0c;无法继续对外提供服务。相对于数据库的硬盘IO&#xff0c;缓存中间件基于内存进行读写&#xff0c;从而具备较大的吞吐量和高并…

5.10.6 用于乳腺癌超声图像分类的Vision Transformer

医学超声&#xff08;US&#xff09;成像由于其易用性、低成本和安全性已成为乳腺癌成像的主要方式。卷积神经网络&#xff08;CNN&#xff09;有限的局部感受野限制了他们学习全局上下文信息的能力。利用 ViT 对使用不同增强策略的乳房 US 图像进行分类。 卷积神经网络&#…

你知道C++多少——默认成员函数

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…

Linux中gitlab-runner部署使用备忘

环境&#xff1a; 操作系统:&#xff1a;CentOS8 gitlab版本&#xff1a;13.11.4 查看gitlab-runner版本 可以从https://packages.gitlab.com/app/runner/gitlab-runner/search找到与安装的gitlab版本相近的gitlab-runner版本以及安装命令等信息&#xff0c;我找到与13.11.4相…

网络 | 应用层-websocket协议概述与握手过程解析

背景&#xff1a;这里为了实现消息实时传输决定引入websocket协议。 不管是发送消息还是接收消息&#xff0c;都需要实时传输&#xff0c;张三发给李四&#xff0c;李四立马就能收到&#xff0c;基于HTTP实现是有些困难的。 但轮询方式也带来了一些问题 1、消耗更多系统资源&…

设计模式——模板设计模式(Template Method)

模板设计-base 什么是模板&#xff1f; 举个简单的例子&#xff0c;以AABB的格式&#xff0c;写出一个词语&#xff0c;你可能会想到&#xff0c;明明白白&#xff0c;干干净净等&#xff0c; 这个AABB就是一个模板&#xff0c;对模板心中有了一个清晰的概念之后&#xff0c;…

draw.text((left, top - 15), text,font=font, fill=“green”)

这是一个Python PIL库中的方法&#xff0c;用于在图片上绘制文本。具体来说&#xff0c;它可以在指定的位置绘制指定的文本&#xff0c;并使用指定的字体、颜色等参数进行渲染。其中&#xff0c;left和top是文本绘制的左上角坐标&#xff0c;text是要绘制的文本内容&#xff0c…

揭秘高效引流获客的艺术:转化技巧大公开

在数字化营销的海洋中&#xff0c;每个企业都如同一艘努力航行的船&#xff0c;而流量便是推动船只前行的风帆。如何有效吸引并获取潜在客户&#xff0c;即所谓的“引流获客”&#xff0c;已成为企业市场营销策略中不可或缺的一环。本文将详细探讨几种实用且高效的引流获客技巧…

Vue从入门到实战Day04

一、组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09; 1. scoped样式冲突 默认情况&#xff1a;写在组件中的样式会全局生效 -> 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式&#xff1a;默认组件中的样式会作用到全局 2. 局部样式&#xff1a;可以…

0X JavaSE-- UML、

# Unified Modeling Language UML 统一建模语言 UML 是一种图形化的语言。 UML 不是专门为 Java 准备的。 只要是面向对象的编程语言&#xff0c;开发前的设计&#xff0c;都需要画 UML 图进行系统设计。 最常用的四个 UML 图是 类图&#xff08;Class Diagram&#xff09;&…

微信小程序踩坑,skyline模式下,简易双向绑定无效

工具版本 基础库版本 Skline模式 页面json设置 问题描述 skyline模式下,textarea,input标签设置简易双向绑定 model:value是无效的,关闭skyline模式就正常使用了 截图展示 这里只展示了textarea标签,input标签的简易双向绑定也是无效的 总结 我在文档里面是没找到skyline里面不…

考研踩坑经验分享

文章目录 写在前面自身情况简介自身学习路线优点坑点 学习路线建议1、2和3月份3、4和5月份6、7和8月份9、10月份11、12月份 一些私货建议结尾 写在前面 考研是一件非常有盼头的事&#xff0c;但绝对不是一件容易的事。 如果你不能做好来年三月份出成绩时&#xff0c;坦然接受…