[MYSQL数据库]--约束

前言

作者:小蜗牛向前冲

名言:我可以接受失败,但我不能接受放弃

  如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 

目录

一、空属性(null/not null)

二、默认值(default) 

三、列描述(comment)

四、整形的补齐(zerofill )

五、主键(primary key)

六、自增长 (auto_increment)

七、唯一键 (unique key)

八、外键(forgin key[]references[])

九、综合测试


本期:学习数据库的约束,表的约束很多,这里主要介绍如下几个:  null/not null,default, comment, zerofill,primary key,auto_increment,unique key 。

 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合 法性,从业务逻辑角度保证数据的正确性。

约束的本质:通过技术手段倒逼程序员,插入正确的数据,而站在mysql的视角,约束的最终目标,保证了数据的完整性和可预期性。

比如有一个字段是email,要求是唯一的。 表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,auto_increment,unique key 。

一、空属性(null/not null)

两个值:null(默认的)和not null(不为空)

数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办 法参与运算。

案例:

创建一个班级表,包含班级名和班级所在的教室。 站在正常的业务逻辑中: 如果班级没有名字,你不知道你在哪个班级 如果教室名字可以为空,就不知道在哪上课 所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。 

创建一个表,并且查看里面的内容

create table myclass( class_name varchar(20) not null, class_room varchar(20) not null);
desc myclass;

继续为表中插入数据:

insert into myclass(class_name) values('class1');//error
insert into myclass(class_name,class_room) values('class1','101');
insert into myclass(class_name,class_room) values('class2','102');
select * from myclass;

 这里我们如果仅仅都class_name,进行插入,而不去管class_room这是不被mysql允许的,因为我们在建表的时候,就设置这字段不能为空,所以就对class_room形成了约束,不让没有数据。

二、默认值(default) 

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值。

案例:

create table t10( name varchar(20) not null, 
age tinyint unsigned default 18, 
sex char(2) default '男');
desc t10;

 为表中插入数据:

insert into t10(name) values('john');
insert into t10(name) values('arrival');
insert into t10(name,age,sex) values('run',19,'女');
select *from t10;

对于默认值简单点来说,就是没有插入值,就用默认值。 

但是如果,我们对字段的属性,设置既不为空(not null),又有默认值会怎么样。

这里我在sex的后面添加hobby。

alter table t10 add hobby varchar(20) not null default '阅读' after sex;
desc t10;
select * from t10;

 

这里我们继续插入数据 

insert into t10(name,age,sex) values('rokey',19,'女');
insert into t10(name,age,sex,hobby) values('sum',19,'女');//error
select * from t10;

这里如果我们不插对hobby插入数据,就会用默认值,但是如果我们选择他不插入会报错误 

三、列描述(comment)

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA 来进行了解。 

举例:

 create table t12(name varchar(20) not null comment '姓名', 
age tinyint comment '年龄');

创建表后,那么查看表是无法查看列描述的,但是我们是可以show来查看,建表的细节。 

四、整形的补齐(zerofill )

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。

可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?

其实没有zerofill这个 属性,括号内的数字是毫无意义的。id和age列就是前面插入的数据,如下 

insert into t13 values(1,23);insert into t13 values(2,324);

如果我们在 age后面加上zerofill会发生什么?

这次可以看到age的值由原来的23变成00000 00023,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里 设置的是10),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。为什么是这样呢?我们可以用hex函数来证明:

 select age,hex(age) from t13;

注意hex是十六进制的输出: 1*16+7 = 23

可以看出数据库内部存储的还是23,00000 00023只是设置了zerofill属性后的一种格式化输出而已。 

细节:为什么创建int的无符号是默认是int(10)?

这是因为一个无符号int的取值范围为0 到 4,294,967,295(2^32-1)最大占10个字节(1亿是9位数,42亿多是10位数)

所以默认创建int的无符号是int(10)

五、主键(primary key)

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

案例:

创建表的时候直接在字段上指定主键

create table t14(
name varchar(20) not null primary key comment '名字不能空',
qq int);

插入数据:

insert into t14 values('abc',1232455);
insert into t14 values('abc',666666);//error
insert into t14 values('daw',666666);
insert into t14 values('das',666666);

这里设置了主键的字段,你重复插入会报错误,而没设置的字段可以重复插入,也就是primart key 约束了被设计类型的唯一性。

当表创建好以后但是没有主键的时候,可以再次追加主键

alter table 表名 add primary key(字段列表)

删除主键 

alter table 表名 drop primary key

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

案例:

create table t15(id int unsigned,name varchar(20),sex char(2),primary key(id,name));

六、自增长 (auto_increment)

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

自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长

案例 :

创建表并且插入数据: 

create table t16(id int unsigned primary key auto_increment,name char(10) not null default '无名氏');insert into t16(name) values('a');insert into t16(name) values('b');
insert into t16(name) values('c');

 在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值):

大家可能会想 auto_increment是如何实现自增长的呢?

其实他在开始di设置为1,随着着插入的数据进行自增,当然我们也可以更改最初设置

show create table t16 \G;

 create table t17( 
id int unsigned primary key auto_increment, n
ame char(10) not null default '无名氏' 
) auto_increment=500;

七、唯一键 (unique key)

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以 解决表中有多个字段需要唯一性约束的问题。 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

关于唯一键和主键的区别:

我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息 出现重复。乍一听好像没啥区别,我们举一个例子

假设一个场景(当然,具体可能并不是这样,仅仅为了帮助大家理解)

  • 比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,一个身份证号码,一 个是员工工号,我们可以选择身份号码作为主键。
  • 而我们设计员工工号的时候,需要一种约束:而所有的员工工号都不能重复。 具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,那么就可以将员工工号设计成为唯 一键。
  • 一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。 

案例: 

create table t18(name varchar(20) primary key,qq varchar(20) unique comment 'qq号不可以被重复',id int unique);

 插入数据:

insert into t18 values('a','2242424',1);
insert into t18 values('b','2242424',1);//error
insert into t18 values('b','232421',1);//error
insert into t18 values('b','232421',2);
select *from t18;

八、外键(forgin key[]references[])

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

语法:

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

 主表和从表的关系如下:

下面我们创建主表myclass和student从表来验证:

创建主表

 create table myclass(id int primary key,name varchar(20) not null comment '班级名字');

创建从表 

create table student(id int primary key,name varchar(20) not null comment '学生名字',class_id int comment '班级id',foreign key (class_id) references myclass(id));

插入数据 

insert into myclass values(101,'自动化1');
insert into myclass values(102,'自动化2');

insert into student values(1,'李白',101);
insert into student values(2,'小乔',101);
insert into student values(3,'孙策',102);
insert into student values(4,'大乔',102);

 插入一个班级号为103的学生,因为没有这个班级,所以插入不成功

插入班级id为null,比如来了一个学生,目前还没有分配班级 

九、综合测试

前面博客中,我们学习对mysql的库操作,表操作,和约束属性,我们初步具备了简单使用库的能力。下面我们一下综合运用前面所学习的知识。

有一个商店的数据,记录客户及购物情况,有以下三个表组成:

  • 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商 provider)
  • 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
  • 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)

要求: 

  •  每个表的主外键
  • 客户的姓名不能为空值
  • 邮箱不能重复
  • 客户的性别(男,女)

建库 

 create database test1;

建立表 

商品:

mysql> create table goods(-> goods_id int primary key auto_increment comment '商品编号',-> goods_name varchar(32) not null  comment '商品名字',-> unitprice float(4,2) not null default 0.00 comment '单价',-> category varchar(12) comment '商品分类',-> provider varchar(64) not null comment '供应商名称'-> );

 

顾客: 

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

 购买

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

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

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

相关文章

C++的学习

代码练习 输入一个字符串&#xff0c;统计其中大写字母、小写字母、数字、空格以及其他字符的个数 #include <iostream>using namespace std;int main() {cout << "请输入一个字符串" << endl;string str;getline(cin,str);int capital 0;int l…

HTTP/1.1 协议优化方案探讨

前言 HTTP/1.1 是目前广泛应用的网络协议之一&#xff0c;虽然已经存在多年&#xff0c;但我们仍然可以通过优化来提升其性能和效率。本文将从优化思路的角度出发&#xff0c;探讨如何在 HTTP/1.1 协议下实现优化&#xff0c;包括避免发送重复 HTTP 请求、减少 HTTP 请求次数、…

分享个好用的GPT网站

目录 一、背景 二、功能描述 1、写代码 2、联网查询 3、AI绘图 一、背景 我现在的开发工作都依靠ChatGPT&#xff0c;效率提升了好几倍。这样一来&#xff0c;我有更多时间来摸鱼&#xff0c;真是嘎嘎香~ ⭐⭐⭐点击直达 ⭐⭐⭐ 二、功能描述 1、写代码 import java.ut…

portainer管理远程docker和docker-swarm集群

使用前请先安装docker和docker-compose&#xff0c;同时完成docker-swarm集群初始化 一、portainer-ce部署 部署portainer-ce实时管理本机docker&#xff0c;使用docker-compose一键拉起 docker-compose.yml version: 3 services:portainer:container_name: portainer#imag…

制冷系统管道焊接气焊安全操作

气焊操作安全教育&#xff1a; 1、检查气焊用具完好牢固无损&#xff0c;不得贴粘有&#xff08;机油&#xff09;&#xff1b; 2、气瓶余压&#xff08;2KG&#xff09;停止使用&#xff1b;清除动火 10 米范围内易燃易爆物料&#xff1b; 3、库房内动火要 做好通风排气&…

海格里斯HEGERLS智能托盘四向车系统为物流仓储自动化升级提供新答案

随着实体企业面临需求多样化、订单履行实时化、商业模式加速迭代等挑战&#xff0c;客户对物流仓储解决方案的需求也逐渐趋向于柔性化、智能化。作为近十年来发展起来的新型智能仓储设备&#xff0c;四向车系统正是弥补了先前托盘搬运领域柔性解决方案的空白。随着小车本体设计…

仅需 5% 训练样本达到最优性能,清华大学研究团队发布条件去噪扩散模型 SPDiff,实现长程人流移动模拟

人流移动模拟 (Crowd Simulation) 是在特定情境中模拟大量人员移动的过程。这项技术主要应用于计算机游戏、城市规划、建筑设计以及交通组织等领域。例如&#xff0c;模拟人群在不同条件&#xff08;如人群密度、流量等&#xff09;下在建筑物内的移动&#xff0c;帮助决策者评…

Enshrouded/雾锁王国服务器配置选择要求,CPU内存带宽

雾锁王国/Enshrouded服务器CPU内存配置如何选择&#xff1f;阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置&#xff0c;支持4人玩家畅玩&#xff0c;自带10M公网带宽&#xff0c;1个月90元&#xff0c;3个月271元&#xff0c;幻兽帕鲁服务器申请页面 https://t.aliyun.com…

勾八头歌之数据科学导论—数据预处理

第1关&#xff1a;引言-根深之树不怯风折&#xff0c;泉深之水不会涸竭 第2关&#xff1a;数据清理-查漏补缺 import numpy as np import pandas as pd import matplotlib.pyplot as pltdef student():# Load the CSV file and replace #NAME? with NaNtrain pd.read_csv(Tas…

精通 Python 装饰器:代码复用与功能增强技巧

精通 Python 装饰器&#xff1a;代码复用与功能增强技巧 引言装饰器基础装饰器的定义基本装饰器的实现方法理解 符号的用法简单装饰器示例代码 使用装饰器增强函数功能日志记录性能测试事务处理小结 装饰器进阶应用管理用户认证缓存机制的实现参数化装饰器的创建和应用多个装饰…

智慧公厕的意义:高效智能的公共厕所运营、服务、协作管理

现代城市的发展离不开智慧技术的引领&#xff0c;而智慧公厕作为城市基础设施的重要组成部分&#xff0c;正在逐渐展现其巨大的意义和价值。通过采用智能管理系统&#xff0c;智慧公厕实现了更高效的管理、更贴心的服务和更协同的业务流程。本文以智慧公厕源头实力厂家广州中期…

【猫头虎科技角】深入Drools:规则引擎的艺术与实践

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

UI学习 一 可访问性基础

教程&#xff1a;Accessibility – Material Design 3 需要科学上网&#xff0c;否则图片显示不出来。设计教程没有图片说明&#xff0c;不容易理解。 优化UI方向 清晰可见的元素足够的对比度和尺寸重要性的明确等级一眼就能辨别的关键信息 传达某一事物的相对重要性 将重…

【猫头虎科技解码】探秘Drools语法:规则引擎在实战中的应用️

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

19、deque赋值操作

#include <iostream> using namespace std; #include <deque>void printdeque (const deque<int>& d) {for (deque<int>::const_iterator it d.begin(); it ! d.end(); it ){//*it 100 容器中的数据不可修改cout << *it << " &…

在linux上部署yolov5和安装miniconda3

第一步&#xff1a;安装miniconda3 官网&#xff1a;Miniconda — Anaconda documentation 这四个命令快速而安静地安装最新的64位版本的安装程序&#xff0c;然后自行清理。要为Linux安装Miniconda的不同版本或体系结构&#xff0c;请在wget命令中更改.sh安装程序的名称。 …

AI怎么抠图?分享3种简单抠图小技巧

AI怎么抠图&#xff1f;AI抠图是一种利用人工智能技术从图像中精确提取出目标物体的过程。这种技术不仅提升了抠图效率&#xff0c;更保证了抠图的准确性&#xff0c;让我们能够更快速、更轻松地完成复杂的抠图任务。同时&#xff0c;随着技术的不断进步&#xff0c;AI抠图的应…

图数据库基准测试 LDBC SNB 系列讲解:Schema 和数据生成的机制

LDBC&#xff08;Linked Data Benchmark Council&#xff09;Social Network Benchmark&#xff0c;简称 LDBC SNB&#xff0c;是一种针对社交网络场景的评估图数据库性能的基准测试。 LDBC 简介 除了 Social Network Benchmark&#xff0c;LDBC 旗下目前还有其他几种基准测试…

iTOP-3588开发板快速启动手册Windows安装串口终端软件创建串口会话

双击上图中红框的应用程序后&#xff0c;软件会启动&#xff0c;界面启动后如下图所示&#xff1a; 下面来创建第一个SSH 会话。点击菜单栏 「会话」 --> 「新建会话」&#xff0c;即可弹出 「会话设置」 对话框&#xff0c;如下图所示&#xff1a; 在会话设置框里面选择串口…

西门子Mendix低代码资深技术顾问张戟,将出席“ISIG-低代码/零代码技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;LowCode低码时代、RPA中国、AIGC开放社区&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索低…