【MySQL数据库入门】:表的约束

news2025/1/17 21:48:46

表的约束

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

表的约束很多,这里主要介绍如下几个:

null/not null,default, comment, zerofill,primary key,
auto_increment,unique key 。

1.空属性

  • 两个值:null(默认的)和not null(不为空)
  • 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运
    算。

image-20221225201729275

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

image-20221225202057433

  • 插入数据时,没有给教室数据插入失败:
  • image-20221225202205839

2.默认值

  • 默认值:

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

image-20221225202444377

  • 默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值

image-20221225202546687

注意:只有设置了default的列,才可以在插入值的时候,对列进行省略

3.列描述

列描述:

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

image-20221225202813368

  • 通过show可以看到:

image-20221225202847349

4.zerofill

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。通过show看看t3表的建表语句:

image-20221225203119178

  • 这里我们就引入了zerofill.

    1. 假如没有zerofill这个属性,括号内的数字是毫无意义的 。

    2. 有zerofill这个属性:

        1. 先修改t3表的属性:

          image-20221225203407851

                       2. 插入数据后:
                          ![image-20221225203522709](https://img-blog.csdnimg.cn/img_convert/0f2ac01062cfc5f091a93a0b9dc6e860.png)
          

这次可以看到id的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是
5),自动填充0。

  • 要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。为什么是这样呢?我们可以
    用hex函数来证明。
  • image-20221225203658717

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

5.主键

  • 主键:

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

  • 例:

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

image-20221225203930995

  • 主键约束:主键对应的字段中不能重复,一旦重复,操作失败。

    image-20221225204024922

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

alter table 表名 add primary key(字段列表)
  • 删除主键
alter table 表名 drop primary key;

image-20221225204220282

将id的主键属性删除了

  • 复合主键

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

image-20221225204552406

  • 全部冲突时,才冲突:
    image-20221225204730677

6.自增长

auto_increment:

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

特点:

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

image-20221225205000281

  • 插入空数据:

image-20221225205016850

  • 结果:

image-20221225205030044

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

image-20221225205107499

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

以后有文章会详细讲到

7.唯一键

  • 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键

  • 唯一键就可以解决表中有多个字段需要唯一性约束的问题。

  • 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较

  • 和主键的区别:

    主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。

  • 例:
    image-20221225205431587

  • 注意:

image-20221225205541214

假如没有主键,有not null+unique key 会被识别成主键

8.外键

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

  • 语法 :

    foreign key (字段名) references 主表(列)
    
  • 例:

image-20221225205731174

  • 对上面的示意图进行设计:

  • 先创建主键表 :

image-20221225211743240

  • 再创建从表

image-20221225211959884

  • 正常插入数据

image-20221225220820444

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

image-20221225220842934

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

image-20221225220921666

  • 如何理解外键约束 :

image-20221225221310961

建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

9.综合案例 - 阅读

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

  • 商品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)

    要求:

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

    -- 创建数据库
    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)
    );
    

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

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

相关文章

版本管理之Git

一.版本控制器的方式1.1集中式版本控制工具集中式版本控制工具,版本库是集中存放在中央服务器的,team里每个人work时从中央服务器下载代 码,是必须联网才能工作,局域网或互联网。个人修改后然后提交到中央版本库。 举例&#xff1…

巧用回调函数解决微信小程序与后台数据交互出现的异步问题

问题描述 微信小程序端需要发送一个包含文字与图片的表单数据给后端,我一开始的思路是先上传图片得到临时的URL,后执行POST请求将表单数据发送给后端,但后端只能获取到文字,而图片URL却始终获取不到。 问题原因 注意看我上面的思路…

目标检测研究

传统的目标检测流水线 1.候选区域生成 通过滑动窗口选择感兴趣区域Rol;使用多尺寸的输入图像和多尺度的滑动窗口识别多尺度和不同比例的目标。 ⒉特征向量抽取 常用SIFT、 Harr、HOG、SURF。 3.区域分类 常用支持向量机。 结合集成、串联学习、梯度…

3D俯视角色割草游戏模板+视频教程,免费发布 | 一周精品推荐

大家好,我是晓衡。新年开工第一周,我就被热心的开发者们感动得热泪盈眶!今天我冒死推荐几款 Creator 游戏开发资源,希望能对得起这些开发者们,同时也希望你能也有所收获。3D俯视角割草游戏视频源码B 站 UP 主『好巧啊c…

MyBatis 数据查询语句中有关于大于,小于的书写方法 及 查询时相关sql 关键字

前言 提示:这里记录的大概内容: MyBatis 数据查询语句中有关于大于,小于的书写方法 一、MyBatis MyBatis 本是 apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为…

Python封装、继承和多态

Python 语言在设计之初,就定位为一门面向对象的编程语言,“Python 中一切皆对象”。同时,Python 也支持面向对象的三大特征:封装、继承和多态。 一、封装 封装(Encapsulation),即在设计类时&am…

讲师邀请 | 在 DevData Talks,开放务实地聊聊研发效能!

什么是 DevData Talks? DevData Talks 是专注于研发效能实践经验与方法论的系列分享活动。 2022 年,我们既看到外部环境变幻莫测,也看到研发效能领域沉下心来稳步发展,从宏大的概念和价值,转向具体的问题&#xff0c…

若依框架代码自动生成器研究-表查询篇

最近生产环境用了一个开源系统:若依,其中有一个版块很有意思,很能提高生产效率: “代码生成器”。 其功能所处模块菜单为:系统工具->代码生成。我们来研究一下他的代码生成逻辑。 工具使用方法 1、建表 使用代码生成&#…

Python列表中你所不知道的事

1. 引言 目前,Python是世界上使用最广泛、最受欢迎的编程语言之一。Python丰富的功能性使它非常流行,因为我们可以使用它创建任何内容。我将在本博客中与大家分享关于Python列表的几条有趣的花絮。 闲话少说,我们直接开始吧! 2.…

如何高薪入职心仪的公司

序 本文首发自:稀土掘金、思否 我们从几个问题开始入手,来看一下本博客是否适合你: 如果你想要换工作,但是:制作的简历平平无奇如果你想要换工作,但是:投放了的简历总是无法得到 [心仪公司] 的…

SpringBoot+Vue茶叶商城系统

简介:本项目采用了基本的SpringBootVue设计的茶叶商城系统。详情请看主要截图。经测试,本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVue茶叶商城系统源码作者LHL项目类型Java EE项目 (…

C#windows彩票信息管理

摘要:近年来,中国彩票行业已经进入市场急速扩张和加速上升的阶段,即开票占整个彩票销量的比率也将急剧上扬。自助售彩终端,这一崭新的售彩模式已被中国彩民接受,爆发点很快来临。到2020年,我国多功能彩票自…

百趣代谢组学文献分享:OnPLS方法在哮喘领域应用研究

百趣代谢组学文献分享,本周分享的文献题目为OnPLS-Based Multi-Block Data Integration: A Multivariate Approach to Interrogating Biological Interactions in Asthma,是由日本前桥群马大学创新研究中心Craig E. Wheelock教授课题组在2018年发表于Ana…

商业智能 BI 人员的六个Level,你到了哪一层?

现在商业智能 BI 行业的从业人员越来越多,但很多人对于自己的职业规划可能并不是特别的清晰,不知道在这个细分领域到底有多大的成长空间,未来大概可以走到哪一个层次。 今天大概介绍下这六个层次,可以是大多数从事商业智能 BI 工…

【计算机程序设计思想与方法】1 什么是计算?

计算是利用计算机解决问题的过程,计算机科学是关于计算的学问。 计算机科学家在用 计算机解决问题时形成了特有的思维方式和解决方法,即计算思维。 1.1 什么是计算? 1.1.1 计算机与计算 计算机是当代最伟大的发明之一。 自从人类制造出第一台电子数字计算机,迄今已近 …

面试题-Java集合常见问题

1 常见集合集合相关类和接口都在java.util中,主要分为三中List(列表)、Map(映射)和Set(集合)其中Collection是集合List、Set的父接口,它主要有两个子接口:List:存储的元素有序,可重复。ArrayList基于数组实现LinkedLis…

STM32开发(二)CubeMX详解构建基本框架

文章目录STM32 CubeMX背景STM32 CubeMX基本配置选择芯片型号新建工程配置系统时钟、调试口、GPIO配置时钟配置配置GPIO (LED为例)GENERATE CODE 生成代码使用工具:CubeMX STM32 CubeMX背景 玩过STM32单片机的朋友都知道,以前的时…

网络协议栈简单设计(udp)

网络协议栈简单设计 操作系统内核中实现了网络协议栈,但今天利用netmap(也可利用dpdk)绕过内核协议栈进行网络数据的收发 netmap 内核协议栈加载数据: 数据从网卡到内核再到内存,需要经过两次拷贝 netmap映射数据&…

List底层源码剖析之List扩容机制

在list集合中有一个add方法: 在众多类中,最长使用的是ArrayList,其中有个方法是add方法 在add方法底层存在 private int size; ensureCapacityInternal(size 1) 其中的size1会对add()方法的调用次数进计数&#x…

Docker系列(常用命令) 02

Docker常用命令总结 docker官方命令文档 一、Docker环境信息命令 docker version # 查看docker版本信息 docker info # 查看docker详细信息二、系统日志信息常用命令 2.1 docker events 作用:从服务器获取实时事件,比如:启动、关闭和创…