当前位置: 首页 > news >正文

【MySQL】表的约束

表的约束

  • 表的约束
    • 1. 空属性
    • 2. 默认值
    • 3. 列描述
    • 4. zerofill(自动补零)
    • 5. 主键—primary key
      • 5.1 复合主键
    • 6. 自增长—auto_increment
    • 7.唯一键 --- unique
    • 8. 外键 --- foreign key…reference
    • 9. 综合案例

表的约束

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

表中一定要有约束,通过约束让我们数据库表中的数据是合法的,符合预期的,约束的本质是通过技术手段让用户插入正确的数据,约束的目的是保证插入数据的完整性和可预期性。

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

null/not null,default,comment, zerofillprimary keyauto_incrementunique key

1. 空属性

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

案例:班级表
包括班级名称 班级地址 其他属性

mysql> create table myclass(-> class_name varchar(20) not null,-> class_address varchar(32) not null,-> class_other varchar(20));

查看表结构和系统的建表信息

在这里插入图片描述
插入数据观察到设置为not null的字段不可以插入NULL,同时不能为空

在这里插入图片描述

2. 默认值

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

案例 :建立表t1;name字段约束不能为空,age和gender字段都设置默认值

mysql> create table if not exists t1(-> name varchar(32) not null,-> age tinyint unsigned default 18,-> gender char(1) default '男');

查看表结构和建表信息,不设置默认值,默认值一列默认为NULL,设置NOT NULL后,NULL列为NO

在这里插入图片描述
插入信息
在这里插入图片描述

null与default联系

案例:

建表:

在这里插入图片描述

插入数据:
在这里插入图片描述

  1. not null和default是不冲突的,而是互补的
  2. 当用户插入数据的时候,not null 让插入的数据必须不为空
  3. 当用户插入有默认值的列时,传入什么是什么,如果不传入值,则用默认值,如果用户没有设置默认值,但是插入的时候忽略了该列,那么报错
  4. 当某一列没有设置not null,MySQL会自动将此列默认值设置为空DEFAULT NULL

3. 列描述

列描述:comment,没有实际含义,专门用来描述字段,即注释作用

可以通过查看建表信息看到列描述
在这里插入图片描述
comment可以帮助数据库管理人员管理数据库的约束

4. zerofill(自动补零)

zerofill:对表中数据进行格式化,插入的数据不足位数则自动补0;

创建表 插入并查询 修改位zerofill
在这里插入图片描述
再次修改数据
在这里插入图片描述
结论:当插入的数据小于填充的位数的时候,会在前面补0;当插入的数据位数大于填充位数,就正常显示

5. 主键—primary key

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

案例:创建表 学号姓名表 其中id是主键
在这里插入图片描述
删除主键 添加主键

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

在这里插入图片描述
在这里插入图片描述

5.1 复合主键

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

mysql> create table if not exists stu(-> id int unsigned,-> course int unsigned comment '课程号',-> score tinyint unsigned comment '成绩',-> primary key(id,course));

复合主键变成了多个字段复合在一起的主键 当他们全都相同的时候无法插入

在这里插入图片描述

6. 自增长—auto_increment

auto_increment:通常和主键搭配使用,作为逻辑主键。当表中某个字段被设置为自增长,如果插入时忽略此字段,默认从1开始每次+1;如果中途设置了,那就从最大值+1开始

自增长的特点:

  1. 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  2. 自增长字段必须是整数
  3. 一张表最多只能有一个自增长
mysql> create table if not exists red(-> id int unsigned primary key auto_increment,-> name varchar(10) not null);

查看建表信息和表结构

在这里插入图片描述

插入数据观察现象

在这里插入图片描述
可以通过建表信息查看 下一次插入的自增值
在这里插入图片描述

新的案例:自己设置自增值从哪开始

mysql> create table mm(id int unsigned primary key auto_increment, name varchar(10) not null) auto_increment=500;

在这里插入图片描述

7.唯一键 — unique

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

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

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

我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。

案例:
创建表std 主键为id 唯一键为tel 原因是现实生活中没有相同的手机号 (有这样的需求)

在这里插入图片描述
引入唯一键是因为,我们选择某一列作为主键,但是并不排除其他属性不需要维护,可能需要用到唯一键来限定该列的唯一性,比如手机号唯一 ,主键与唯一键配合起到更好的约束作用

8. 外键 — foreign key…reference

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

设置外键的方式

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

班级表

mysql> create table if not exists class(-> id int primary key,-> name varchar(20) not null);

学生表

mysql> create table if not exists student( 
id int unsigned primary key auto_increment, 
name varchar(10) not null, 
tel varchar(11) not null unique, 
cllass_id int, foreign key(class_id)references class(id) );

查看表结构
在这里插入图片描述
插入数据并尝试删除,失败
在这里插入图片描述

删除主表数据
在这里插入图片描述
上面的案例中

  1. student是从表
  2. class是主表
  3. 二者具有关联关系 ,不能随意删除(外键的作用)
  4. 外键约束主要定义在从表上,主表则必须是有主键约束或unique约束

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)

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

-- 创建数据库
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 decimal(10,4) not null default 0.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】表的约束

表的约束 表的约束1. 空属性2. 默认值3. 列描述4. zerofill(自动补零)5. 主键—primary key5.1 复合主键 6. 自增长—auto_increment7.唯一键 --- unique8. 外键 --- foreign key…reference9. 综合案例 表的约束 真正约束字段的是数据类型,…...

【计算机网络】第一章 概述(下)

文章目录 第一章 概述1.5 计算机网络的性能指标1.5.1 速率1.5.2 带宽1.5.3 吞吐量1.5.4 时延 1.6 计算机网络体系结构1.6.1 常见的体系结构1.6.2 分层的必要性1.6.4 体系结构中的专用术语 1.8 习题 第一章 概述 1.5 计算机网络的性能指标 常用的 计算机网络 的性能指标有以下 …...

化工园区人员全过程轨迹化安全解决方案

1、项目背景 化工园区化工厂是生产安全重点单位,对人员定位管理需求强烈。对人员定位主要需求是:一般区域人数统计、人员轨迹、重点区域人员实时精准定位。 华安联大安全化工园区人员全过程轨迹化安全解决方案通过人员实时定位管理、移动轨迹追溯、险情…...

Java泛型中的T、E、K、V、?通配符,你确定都了解吗?

目录 前言 泛型带来的好处 泛型中通配符 小结 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操…...

Jenkins部署及使用

Jenkins 1.定义 1.Jenkins是一款开源CI/CD软件,用于自动化各种任务,包括构建、测试和部署软件 1.CI/CD 1.CI:持续集成(Continuous Integration) 1.协同开发是目前主流的开发方式,一般由多位开发人员同时处理同一个应用的不同模块…...

UML类图(二)

相信希望,相信自己 上一章简单介绍了 设计模式的原则(一), 如果没有看过,请观看上一章 本文参考文章: 常见UML符号详解 UML (Unified modeling language) 统一建模语言,是一种用于软件系统分析和设计的语言工具, 它用于帮助软件开发人员进行…...

【IoU全总结】GIoU, DIoU, CIoU, EIoUFocal, αIoU, SIoU,WIoU【基础收藏】

🥑 Welcome to Aedream同学 s blog! 🥑 并不存在效果一定优秀的IoU,需要结合自己的网络、数据集试验。 不想深究原理可直接跳转总结。文内公式均为手打,非图片,方便查看 文章目录 L1 Loss,L2Loss&#xff0…...

docker 安装 mysql

第一步,安装docker ,确保centos环境符合要求,有网 yum install docker -y 第二步:拉取mysql 首先可以先查询支持的mysql: search # 拉取镜像 docker pull mysql # 或者 docker pull mysql:latest # 以上两个命令是一致的&…...

Java 流程控制之 for 循环

Java语言中的for循环是一种常用的循环结构,用于重复执行一段代码,直到指定的条件不再成立。在本篇博客中,我们将深入探讨Java中的for循环,包括其语法、用法和示例。 一、for循环的基本语法 for循环的基本语法如下: …...

Kubernetes那点事儿——暴露服务之Ingress

Kubernetes那点事儿——暴露服务之Ingress 前言一、ingress负载均衡器Ingress Controller路由规则Ingress 二、Ingress Controller三、案例 前言 在 k8s 集群中,如果我们将服务暴露出来,提供访问,可以使用Nodeport方式,但是Nodepo…...

八股文总结

文章目录 项目介绍1.不动产项目项目难点机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 系统流程图 2.图书项目技术栈ShiroMybatisMyBatis:Mybatis Plus: 面试问题 Java基础基本数据类型反射接口和抽象类异常代理模式1. 静态代理2. 动…...

【浅学 MyBatis 】

MyBatis 笔记记录 一、MyBatis基础1. MyBatis介绍及快速入门2. 相关API介绍2.1 Resources2.2 SqlSessionFactory&&SqlSessionFactoryBuilder2.3 SqlSession 3. 映射配置文件4. 核心配置文件4.1 规范写法4.2 参数和返回类型_起别名 5. 引入Log4j 二、MyBatis进阶1. 接口…...

Windows版Redis安装

最近电脑重装了系统,很多常用的软件、应用都没有了,所以需要重新装,所以想借此机会把一些安装比较复杂的应用的安装过程,重新记录一下,方便后续, 安装 Redis默认只有Linux的版本,但是微软为了更…...

Flume面试题二十道

什么是Apache Flume? 参考答案:Apache Flume是一个可靠、分布式、可扩展的日志收集和聚合系统。它用于将大量的日志数据从不同的源(如Web服务器、应用程序日志)传输到目标(如Hadoop、HBase)中进行存储和分析…...

单链表OJ题:LeetCode--138.复制带随即指针的链表

朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第138道单链表OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏:数据结构与算法 个 人…...

Chapter7: SpringBoot与数据访问

尚硅谷SpringBoot顶尖教程 1. JDBC 1.1 依赖及配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>mysql</groupId…...

【Sqlite3】maraidb和sqlite3部分命令操作区别

maraidb和sqlite3部分命令操作区别记录 1.安装sqlite3 在实现我的视频点播系统项目时&#xff0c;我尝试封装了两种数据库的调用逻辑 mysql&#xff08;maraidb&#xff09;sqlite3 这里封装sqlite3的原因是&#xff0c;sqlite3主要针对的就是嵌入式数据库&#xff0c;其性能…...

Linux中新建用户使用sudo问题

文章目录 sudo问题 sudo问题 sudo&#xff1a;权限提示指令&#xff0c;当使用sudo这条指令时&#xff0c;会将普通用户的权限提升为root权限 但是在命令行新建用户&#xff0c;这个用户使用sudo指令对一条指令提权是用不了的 这个用户没有在sudoers file这个文件中&#xff…...

Sentinel源码分析-ProceesorSlotChain调用链及树状资源节点

Sentinel 实现流控&#xff0c;隔离&#xff0c;降级等功能&#xff0c;本质要做两件事&#xff1a; 数据统计&#xff1a; 统计某个资源的访问数据&#xff08;QPS,RT&#xff08;响应时间&#xff09;&#xff0c;异常比例&#xff09;等信息规则判断&#xff1a; 判断流控规…...

springboot 连接 kafka集群(kafka版本 2.13-3.4.0)

springboot 连接 kafka集群 一、环境搭建1.1 springboot 环境1.2 kafka 依赖 二、 kafka 配置类2.1 发布者2.1.1 配置2.1.2 构建发布者类2.1.3 发布消息 2.2 消费者2.2.1 配置2.2.2 构建消费者类2.2.3 进行消息消费 一、环境搭建 1.1 springboot 环境 JDK 11 Maven 3.8.x spr…...

Nacos配置中心使用(Spring Cloud版)

目标 向项目中集成Nacos配置。原项目是一个SpringBoot项目。这里假设我们无法修改原有项目的SpringBoot版本。 注意 在不动SpringBoot版本的前提下&#xff0c;根据SpringBoot的版本&#xff0c;确定Spring Cloud和Nacos版本。Nacos版本其实就是Spring Cloud Alibaba版本。在…...

STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)

STM32F407硬件I2C实现MPU6050通讯 文章目录 STM32F407硬件I2C实现MPU6050通讯cubeide设置写操作与读操作函数实现复位&#xff0c;读取温度&#xff0c;角度等函数封装mpu6050.cmpu6050.h代码分析 DMP移植1.修改头文件路径为自己的头文件路径2.修改I2C读写函数为自己mcu平台的读…...

HTML5 语义元素(一)页面结构

本篇主要介绍HTML5增加的语义元素中关于页面结构方面的&#xff0c;包含&#xff1a; <article>、<aside>、<figure>、<figcaption>、<footer>、<header>、<main>、<nav>、<section>等元素。 目录 1. 语义元素介绍 1.…...

嵌套滚动实践:onInterceptTouchEvent与NestedScrolling【实用为准】

嵌套滚动&#xff1a;内外两层均可滚动&#xff0c;比如上半部分是一个有限的列表&#xff0c;下半部分是WebView&#xff0c;在内层上半部分展示到底的时候&#xff0c;外部父布局整体滚动内部View&#xff0c;将底部WevView拉起来&#xff0c;滚动到顶部之后再将滚动交给内部…...

Redis入门 - 5种基本数据类型

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis入门 - 5种基本数据类型 | CoderMast编程桅杆https://www.codermast.com/database/redis/five-base-datatype.html 说明 在我们平常的业务中基本只会使用到Redis的基本数据类型&#xff08;String、List、Hash、Set、…...

mybatis-plus用法(一)

MyBatis-plus 是一款 Mybatis 增强工具&#xff0c;用于简化开发&#xff0c;提高效率。下文使用缩写 mp来简化表示 MyBatis-plus&#xff0c;本文主要介绍 mp 整合 Spring Boot 的使用。 (5条消息) mybatis-plus用法&#xff08;二&#xff09;_渣娃工程师的博客-CSDN博客 1…...

源码安装包管理

1. 源码包基本概述 在linux环境下面安装源码包是比较常见的, 早期运维管理工作中&#xff0c;大部分软件都是通过源码安装的。那么安装一个源码包&#xff0c;是需要我们自己把源代码编译成二进制的可执行文件。 源码包的编译用到了linux系统里的编译器&#xff0c;通常源码包…...

Vue|获取表单数据

在Vue中获取表单数据有多种方式&#xff0c;具体取决于你使用的是哪种表单元素和你的需求。 1. 单个表单元素&#xff1a; 如果你只需要获取单个表单元素的值&#xff0c;可以使用v-model指令将表单元素的值绑定到Vue实例的一个属性上。例如&#xff1a; <input type&quo…...

微信小程序入门学习02-TDesign中的自定义组件

目录 1 显示文本2 自定义组件3 变量定义4 值绑定总结 我们上一篇讲解了TDesign模板的基本用法&#xff0c;如何开始阅读模板。本篇我们讲解一下自定义组件的用法。 1 显示文本 官方模板在顶部除了显示图片外&#xff0c;还显示了一段文字介绍。文字是嵌套在容器组件里&#xf…...

【linux kernel】linux media子系统分析之media控制器设备

文章目录 一、抽象媒体设备模型二、媒体设备三、Entity四、Interfaces五、Pad六、Link七、Media图遍历八、使用计数和电源处理九、link设置十、Pipeline和Media流十一、链接验证十二、媒体控制器设备的分配器API 本文基于linux内核 4.19.4&#xff0c;抽象媒体设备模型框架的相…...

廊坊那家做网站排行榜/微信朋友圈广告推广代理

深入学习JVM内存设置原理和调优这里向大家描述一下JVM内存设置原理和内存调优&#xff0c;设置jvm内存的方法&#xff0c;对于单独的.class&#xff0c;可以用下面的方法对Test运行时的jvm内存进行设置。JVM内存设置原理默认的java虚拟机的大小比较小&#xff0c;在对大数据进行…...

做网站大概要多久/网站空间

Vue组件更新我们之前有探讨过Vue的数据响应原理与nextTick的实现机制&#xff0c;除了这两项Vue还有一个很重要的知识点&#xff1a;就是组件更新。我们之前学习数据响应原理的时候曾经了解到我们的数据变化是可以被监听到的&#xff0c;在数据变更后&#xff0c;Vue会进行对应…...

中上网站建设/网络宣传平台有哪些

2017-04-06 回答python编程下&#xff0c;检查ip是否能ping通&#xff0c;并且分别导入两个文件&#xff0c;代码如下&#xff1a;#!/usr/bin/python#-*- coding:gb18030 -*-created on 2015-7-7#判断文件中的ip是否能ping通&#xff0c;并且将通与不通的ip分别写到两个文件中#…...

可以做外链的网站/网页设计免费模板

【问题描述】 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。子网掩码与 IP 地址结构相同&#xff0c;是32 位二进制数&#xff0c;其中网络号部分全为 “1” 和主机号部分全为 “0” 。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP …...

如何为wordpress添加音乐播放器/大连网络推广

上周听了tt大神作分享&#xff0c;获益良多。之前一直不知道Windows的域是怎么回事&#xff0c;有点被点拨开悟了一些。趁现在还有记忆&#xff0c;把当时的记录回忆一下。活动目录&#xff0c;即Active Directory&#xff0c;是Windows服务器环境的一个核心服务&#xff0c;对…...

北京团建网站/网站seo培训

昨天跟以前的EPG Leader聊起现在的工作的问题&#xff0c;他说还是有很多工作可以开展的。我们提到人的能力的问题的时候&#xff0c;他说就是培训。首先要给领导洗脑&#xff0c;让领导觉得培训的重要性&#xff0c;然后就是多进行培训。他说新人多才好办啊&#xff0c;一张白…...