MySQL —— 约束

一、概念介绍

MySQL是数据管理的最后一层防线,因此在对数据进行各种操作的时候,我们尽可能的从技术的角度去对用户进行各种合理的约束,使得各种数据的操作尽可能的合理,这就是约束的概念,本篇将整理常见的基本约束,并且介绍其应用场景和使用方法

二、非空约束

在建表时,有一些字段在插入数据时,我们可以根据实际的业务情况,去要求不允许为空,默认情况下,不做任何约束时,字段是允许插入NULL的,因此在建表的时候,可以在不需要为空的字段后面添加not null去约束该字段插入时不允许为空

使用方式:在建表时,字段后面添加not null即可

例子:

三、默认值

当我们插入某个信息时,可能会对部分字段进行省略,当省略时,MySQL会自动采取默认值去插入,这个默认值在建表时若是不设置任何约束,则会自动被设置成NULL,也可以手动的去设置默认值

设置方法:default 默认值

例子:

关于default和not null有一个细节,在默认不做任何约束的情况下,默认值一般为NULL,而若是做了其他的约束,则不会设置默认值,此时,若是省略该字段插入数据,会报没有默认值的错误

四、列描述

列描述的作用相当于一种备注,使用“show create table table_name\G ”可以看到创建表时所添加的备注信息,这是一种软约束,是针对用户在插入数据或者操作数据时,可以根据备注去更加规范操作的一种约束

使用方式:在声明字段后面加上comment '描述信息'

五、zerofill

在定义无符号整形时,会看到后面会默认带上一个(10)

这个(10)的含义是指,该整形占据多少位格子,但默认不显示出来,若是加上zerofill,则若是插入的数字长度不够10,则会自动补0到10个格子位的长度,若是超出则输入什么显示什么,示例:

六、主键 primary key

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个 主键;主键所在的列通常是整数类型,可以认为主键就是用来找到表中某个可以用来标志性区分每一行信息的某个特征,例如学生名单中可以把学号作为主键,这种具有唯一性的标识,根据实际的业务需求,我们可以将具有唯一性、标志性的特质作为主键进行约束,主键也可以设置其自增

自增使用注意事项:

任何一个字段要做自增长,前提是本身是一个索引(key一栏有值

 自增长字段必须是整数

一张表最多只能有一个自增长

使用方式:

1.在字段后面加上 primary key auto_increment(也可以不带自增)

2.在字段后面加上自增(也可以不加)auto_increment,然后再末尾定义完后,再声明主键

primary key(字段名称)

上面的样例是示范只有一列作为主键时,一张表中主键只能有一个,但并不代表主键只能有一列,在有些情况下,可以选择两列甚至多列去作为复合主键,复合主键要从整体上去看唯一性

例子:学生选课系统,我们要求每个学生可以继续多次选择,但是不能重复的去选择同一种课程,而一个课程也可以被不同学生去选择,所以在这个表格中的学生是可以重复出现的,课程也是可以重复出现的,但同一个学生不能多次选择同一个课程,也就是学生和课程的组合,具有唯一性,此时可以用到复合主键进行约束

插入几个值测试一下效果:

七、唯一键 unique

唯一键的作用用来约束一些只能出现一次的特征信息,主键也有唯一性的功能,但主键更多的是强调这个信息的唯一标识,而除了某个特征可以作为唯一标识外,还有很多具有唯一性的特征需要被约束,此时就需要唯一键的约束,设立唯一键的字段具有唯一性,不可重复,也可以让其自增,但注意一个表只能设置一个自增量

使用方式:在字段描述后添加unique

例如上面建立的这个表,约束了qq和电话号是唯一的,而学号作为主键也是唯一的,此时插入重复的qq或者电话就会被拦截

八、外键 foreign key

外键过多是约束表和表之间的链接,在一些复杂关系或者一个较为庞大的系统中,我们往往有不止一个表格,在表格之间也会存在一定的从事关系,外键就是用来约束这种从属关系之间的基本数据逻辑的合理性,这种针对于从表和主表之间的约束就被叫做外键

使用方式:在定义从表时,最后要声明外键约束:

foreign key (字段名称) references 主表名称(主表具有唯一性的字段,最好是主键)

举个例子:每个学生会从属到某个班级中,我们需要对学生信息进行描述和管理,而不同的班级可能会存在各种不同的属性,也需要被描述和管理,因此学生信息表和班级属性表之间可以建立起一种从属关系,避免一些不符合逻辑的信息插入

主表:班级表

从表:学生信息表

非法情况:我们允许学生信息表中,班级信息中出现不存在的班级,也不允许班级表中某个班级被删除前,该班级内还有学生,对这些基本的逻辑错误,通过外键去进行约束拦截

插入数据测试效果:

九、情况模拟

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

商品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 if not exists bit32mall
default character set utf8 ;
-- 选择数据库
use bit32mall;
-- 创建数据库表
-- 商品
create table if not exists goods
(
goods_id int primary key auto_increment comment '商品编号',
goods_name varchar(32) not null comment '商品名称',
unitprice int not null default 0 comment '单价,单位分',
category varchar(12) comment '商品分类',
provider varchar(64) not null comment '供应商名称'
);
-- 客户
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)
);

总结

本章总结了MySQL语句中的各种约束以及使用方式和使用情景

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

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

相关文章

SOCKET编程(4):SOCKET实战

SOCKET实战 Writen()、Readn()函数 send()函数存在需要发送的字符数len小于函数返回的已发送的字符数(ssize_t)的问题 recv()函数存在需要接收的字符数len小于函数返回的已接收的字符数(ssize_t)的问题 解决上述问题通过Writen()、Readn()函数实现 //buff是数据存储地址&a…

资源管理游戏模版进入The Sandbox

我们非常高兴地向您介绍 Game Maker 的最新模板:资源管理游戏! 这一全新的模板让您能够深入身临其境的游戏体验中,同时掌握令人兴奋的新机制。通过揭开模板的神秘面纱,您可以锤炼您的游戏设计技能。 什么是资源管理游戏&#xff1…

手机电脑通用便签推荐 好用便签下载

便签软件作为一种日常记录和管理工具,其实用性和便捷性深受用户喜爱。一款优秀的便签软件不仅能帮助我们随时随地记录重要信息,还能有效提高工作效率。然而,市场上很多便签应用仅限于单一平台使用,对于需要在手机和电脑间频繁切换…

条件平差——以水准网平差为例 (python详细过程版)

目录 一、原理概述二、案例分析三、代码实现四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、原理概述 条件平差的函数模型和随机模型为: A V + W = 0

已解决【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch解决方法

本文摘要:【nvidia-smi】Failed to initialize NVML: Driver/library version mismatch解决方法。 😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专…

服务器内存占用不足会怎么样,解决方案

在当今数据驱动的时代,服务器对于我们的工作和生活起着举足轻重的作用。而在众多影响服务器性能的关键因素当中,内存扮演着极其重要的角色。 服务器内存,也称RAM(Random Access Memory),是服务器核心硬件部…

做视频号小店,怎么找达人合作?这里有详细讲解

大家好,我是电商笨笨熊 做视频号小店是没有自然流量的,这点刚入驻的新玩家还不清楚; 因此很多老电商玩家们还想着继续拿其他平台动销自然流的玩法去做视频号; 只能说这种方式在视频号是完全行不通的,当下想要推广售…

高效电源测试设备助力自动化测试和数据分析

在当今电子产品的研发和生产过程中,电源测试设备的重要性不言而喻。一款优秀的电源测试设备能够显著提升测试效率,确保电源模块的性能达到设计要求。 纳米软件NSAT-8000电源测试系统是一款自动化电源测试设备,在测试电源模块时,通…

C++笔试强训day16

目录 1.字符串替换 2.神奇数 3.DNA序列 1.字符串替换 链接 简单的遍历替换即可&#xff1a; class Solution { public:string formatString(string str, vector<char>& arg) {string ret;int k 0;for (int i 0; i < str.size(); i){if (str[i] %){ret arg…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷3(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

Ecoinvent中system model中的 cutoff、consequential、apos的区别:

一&#xff1a;解释 Cutoff (截断)模型:只考虑主要的生产过程,不考虑副产品的进一步影响。比如说牛奶厂在生产牛奶的同时会产生奶酪,cutoff模型只考虑牛奶的影响,不考虑奶酪的后续利用。 Consequential (后果)模型:考虑某个决策或变化会引起的一系列连锁反应和影响。比如说我们…

【Pip】pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED]解决方案

pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED] 大家好 我是寸铁&#x1f44a; 总结了一篇pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED]✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 报错 今天在安装第三方包时报错如下: 解决方案 本质上是需要指定信任的镜像…

云效 Pipeline as Code 来了!这些场景,用好它效率翻倍!

从可视化编排到支持 YAML 编排 云效流水线 Flow 是开箱即用的企业级持续集成和持续交付工具&#xff0c;支持丰富的代码源、构建、自动化测试工具、多种部署类型和部署方式&#xff0c;与阿里云深度集成&#xff0c;还提供多种企业级特性&#xff0c;助力企业高效完成从开发到…

itextpdf 7生成pdf(主要是文字和表格,支持中文)

我们经常会遇到要导出pdf的需求,方式有很多种 今天的教程是采用itextpdf的方式生成pdf itextpdf是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF文档&#xff0c;而且可以将Html文件转化为PDF文件。 这里先展示一下效果图 首先在pom.xml中引入相关依赖 <dep…

Vue3 - 前端项目代码防止被调试/被爬,阻止浏览器F12开发者工具

项目背景 大家都知道浏览器的开发者工具能干啥&#xff0c;正经的用法&#xff1a;开发时调试代码逻辑&#xff0c;修改布局样式&#xff1b;不正经的用法&#xff1a;改改元素骗骗人&#xff0c;找找网站接口写爬虫&#xff0c;逆向js破解加密等等&#xff0c;所以说前端不安…

怎么制作流程图?介绍制作方法

怎么制作流程图&#xff1f;在日常生活和工作中&#xff0c;流程图已经成为我们不可或缺的工具。无论是项目规划、流程优化&#xff0c;还是学习理解复杂系统&#xff0c;流程图都能帮助我们更直观地理解和表达信息。然而&#xff0c;很多人可能并不清楚&#xff0c;其实制作流…

进程间通信(一)

IPC 在之前我们也有涉及到进程间通信的知识点&#xff0c;比如fork或exec或父进程读取子进程的退出码等&#xff0c;但是这种通信方式很有限&#xff0c;今天来学习进程间通信的其他技术——IPC&#xff08;InterProcess Communication&#xff09;。 IPC的方式通常有管道&…

Windows 10 Manager (Win10优化工具),中文破姐版 v3.9.3

01 软件介绍 Windows 10 Manager是一款为Win10操作系统设计的综合优化工具。包含逾40种不同的功能模块&#xff0c;旨在全方位地提升系统性能。其核心效用体现在对Win10的优化、调整、清理、加速和修复方面。能够显著提高系统的运行速度&#xff0c;并有效地排查及解决系统问题…

无管理员权限linux系统手动切换cuda版本

查看当前计算机cudatoolkit的版本 nvcc -V下载 如果想切换到指定版本&#xff0c;则去官网下载&#xff08;10.1版本为例&#xff09;&#xff1a; cuda下载 cudnn下载 将下载好的文件放到服务器的文件夹中 安装 安装cuda sh cuda_10.1.243_418.87.00_linux.run选择接受 …

Python中的数据可视化:阶梯图matplotlib.pyplot.step()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 Python中的数据可视化&#xff1a; 阶梯图 matplotlib.pyplot.step() [太阳]选择题 matplotlib.pyplot.step()的功能是&#xff1f; import matplotlib.pyplot as plt import numpy as…