【MySQL表的约束】

文章目录

  • 前言:
  • 1. 空属性
  • 2. 默认值
  • 3. 列描述
  • 4. zerofill
  • 5. 主键
  • 6. 自增长
  • 7. 唯一键
  • 8. 外键
  • 9 . 综合案例 - 阅读

前言:

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的这就是一个约束条件,或者要求它不能为空,这也是一个约束条件。
表的约束很多,这里主要介绍如下几个:

 null/not  null, default, comment, zerofill,
 primary keyauto_incrementunique key

1. 空属性

  • 两个值:null(默认的)和not null(不为空)
  • 数据库默认字段基本都是字段为空,但是实际开发时尽可能保证字段不为空,因为数据为空没办法参与运算。
    在这里插入图片描述
    案例:创建一个班级表,包含班级名和班级所在的教室。
    站在正常的业务逻辑中:
  • 如果班级没有名字,你不知道你在哪个班级
  • 如果教室名字可以为空,就不知道在哪上课
    所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。
    在这里插入图片描述

2. 默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
在这里插入图片描述
默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值。
在这里插入图片描述
–注意:只有设置了default的列,才可以在插入值的时候,对列进行省略

3. 列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解(给人看的)。
通过desc查看不到注释信息
在这里插入图片描述
通过show可以看到
在这里插入图片描述

4. zerofill

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。通过show看看tt3表的建表语句:
在这里插入图片描述
可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?其实没有zerofill这个属性,括号内的数字是毫无意义的。a和b列就是前面插入的数据,如下:
在这里插入图片描述
但是对列添加了zerofill属性后,显示的结果就有所不同了。修改tt3表的属性:
在这里插入图片描述
对a列添加了zerofill属性,再进行查找,返回如下结果:
在这里插入图片描述

这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是5),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。为什么是这样呢?我们可以用hex函数来证明。
在这里插入图片描述
可以看出数据库内部存储的还是1,00001只是设置了zerofill属性后的一种格式化输出而已。

5. 主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个
主键;主键所在的列通常是整数类型。
案例:
创建表的时候直接在字段上指定主键
在这里插入图片描述
key 中 PRI表示该字段是主键。

  • 主键约束:主键对应的字段中不能重复,一旦重复,操作失败。
    在这里插入图片描述
  • 当表创建好以后但是没有主键的时候,可以再次追加主键。
alter table 表名 add primary key(字段列表)

在这里插入图片描述

  • 删除主键
alter table 表名 drop primary key;

在这里插入图片描述

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

6. 自增长

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

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)。
  • 自增长字段必须是整数。
  • 一张表最多只能有一个自增长
    在这里插入图片描述
    在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)
    在这里插入图片描述

索引:

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

7. 唯一键

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

我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,
不要和别的信息出现重复。乍一听好像没啥区别,我们举一个例子:
假设一个场景(当然,具体可能并不是这样,仅仅为了帮助大家理解)
比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,
一个身份证号码,一个是员工工号,我们可以选择身份号码作为主键。
而我们设计员工工号的时候,需要一种约束:而所有的员工工号都不能重复。
具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,
那么就可以将员工工号设计成为唯一键。
一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,
我们可以尽量不会对主键做过大的调整。

在这里插入图片描述

8. 外键

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

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

案例:
在这里插入图片描述
对上面的示意图进行设计:

  • 先创建主键表:
create table myclass (
id int primary key,
name varchar(30) not null comment'班级名'
);
  • 再创建从表
create table stu (
id int primary key,
name varchar(30) not null comment '学生名',
class_id int,
foreign key (class_id) references myclass(id)
);
  • 正常插入数据
mysql> insert into myclass values(10, 'C++大牛班'),(20, 'java大神班');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into stu values(100, '张三', 10),(101, '李四',20);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
  • 插入一个班级号为30的学生,因为没有这个班级,所以插入不成功
mysql> insert into stu values(102,'wangwu',30);
ERROR 1452 (23000): Cannot add or update a child row: 
a foreign key constraint fails (`csdn`.`stu`, CONSTRAINT `
stu_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `myclass` (`id`))
  • 插入班级id为null,比如来了一个学生,目前还没有分配班级
    在这里插入图片描述
  • 如何理解外键约束
MySQL中的外键约束是一种确保数据完整性的机制,它允许你在一个表中的字段上定义
另一个表的主键。外键约束确保了参照完整性,这意味着外键引用的数据必须存在于指定
的表中。
通俗地说,外键约束就像是一个指向另一个表的指南针。如果一个表中的某个字段被定义
为了外键,那么这个字段的值必须是另一个表中的主键值。如果没有找到匹配的值,数据库
会报错。
这种机制有很多用途。例如,你可能有一个"订单"表和一个"客户"表,每个订单都关联到
一个客户。在这种情况下,你可以在"订单"表的"客户ID"字段上设置外键约束,以确保每个
订单都关联到一个有效的客户。
使用外键的好处是,它可以帮助避免因无效数据而导致的错误,并确保数据的准确性。
然而,它也有一些性能开销,因为每次插入或更新记录时,数据库都需要检查外键约束是
否被违反。
需要注意的是,虽然外键约束在大多数情况下都是有益的,但它们也可能导致数据
冗余和复杂性增加。因此,在使用外键约束时,需要权衡利弊。

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语句:

  • – 创建数据库
    在这里插入图片描述
  • – 选择数据库
    在这里插入图片描述
    – 创建数据库表
  • – 商品
    在这里插入图片描述
  • – 客户
    在这里插入图片描述
  • – 购买
    在这里插入图片描述

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

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

相关文章

代数结构与图论

文章目录 图的基本概念代数系统群与环格与布尔代数 图的基本概念 代数系统 单位元和零元如果存在,则是唯一的当代数系统的元素大于1时,单位元与零元不相等对于可结合的二元运算,可逆元素的逆元唯一同类型的代数系统:运算个数相同…

基于js和html的骰子游戏

介绍: 1.游戏者选择“大”时,三个骰子点数之和为11-18时,游戏者获胜。2.游戏者选择“小”时,三个骰子点数之和为3-10时,游戏者获胜。3.如果游戏者选择具体点数,则根据三个骰子的点数计算,如果与…

《C++PrimerPlus》第13章 类继承

13.1 一个简单的基类 基类和派生类示例&#xff08;球会会员管理&#xff09; 头文件tabtenn1.h #ifndef __TABTENN1_H__ #define __TABTENN1_H__#include <iostream> #include <string>using namespace std;class TableTennisPlayer {private:string firstname;…

js实时监听input输入框值的变化

实习日记之通过调用common chemistry的api接口实现输入keyword查找cas号和mw。做了一个简单的html网页&#xff0c;用到了ajax技术。比较简单&#xff0c;适合刚入门的宝学习参考。代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&l…

理解 AQS 和 ReentrantLock

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、公平锁和非公平锁 1.1 含义 1.2 如何自我实现 1.2.1 公平锁实现&#xff1a; 1.2.2 非公平锁实现: 1.2.3 公平和非公平的区…

Leetcode的AC指南 —— 哈希法/双指针:15. 三数之和

摘要&#xff1a; Leetcode的AC指南 —— 15. 三数之和。题目介绍&#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且…

数据结构学习 Leetcode72 编辑距离

关键词&#xff1a;动态规划 最长公共子序列 题目&#xff1a; 思路&#xff1a; 这题我虽然做出来了但是还是有点迷糊。首先&#xff0c;这道题一定是和最长公共子序列相似的。 所以往最长公共子序列方向思考&#xff0c;考虑的它的状态和转移方程以及边界。 状态和转移方…

Ajax学习

文章目录 AjaxAjax 是什么Ajax 经典应用场景Ajax 原理示意图ajax的异步请求的方法ajax的逻辑:应用实例-验证用户名是否存在思路框架图:需求分析: 到数据库去验证用户名是否可用思路框架图大功告成:使用JQuery-Ajax实现上面相同的需求:Ajax Ajax 是什么 AJAX 即"Async…

【HTML5】第1章 HTML5入门

学习目标 了解网页基本概念&#xff0c;能够说出网页的构成以及网页相关名词的含义 熟悉Web标准&#xff0c;能够归纳Web标准的构成。 了解浏览器&#xff0c;能够说出各主流浏览器的特点。 了解HTML5技术&#xff0c;能够知道HTML5发展历程、优势以及浏览器对HTML5的支持情…

【嵌入式开发学习必备专栏】

文章目录 嵌入式开发学习必备专栏1.1 ARM Coresight SoC-400/SoC-600 专栏导读目录1.1.1 Performance Profiling1.1.2 ARM Coresight Debug 工具系列1.1.2.1 ARM DS5 系列1.1.2.2 劳特巴赫 Trace32 系列1.1.2.3 JTAG OpenOCD 系列 1.2 ARM Cache 专栏1.3 ARM AMBA Bus 专栏1.3.…

java使用JSON工具解析字符串、数组详解

一&#xff1a;问题 1.最近自己在前后端数据交互时需要进行JSON格式字符串、数组数据进行转换&#xff0c;进行问题整理 2.遇到需要JSON字符串转换的朋友可以阅读 二&#xff1a;解析步骤 1.第一点首先确定需求&#xff0c;明确需要转的字符串是一个对象还是一个数组&#…

C练习——判断三角形并求面积

题目&#xff1a;从健盘任意输入三角形的三边长为a,b,c,编程判断a,b,c的值能否构成一个三角形&#xff0c;若能构成三角形&#xff0c;则计算并输出三角形的面积&#xff0c;否则提示不能构成三角形。 已知构成三角形的条件是&#xff1a;任意两边之和大于第三边。 解析&#…

jQuery-Validate验证插件的使用步骤【详解】

jQuery-Validate验证插件的使用步骤详解 1. 写在前面2. 效果展示3. Validate环境的搭建4. Validate基本方法的使用5. 实现错误消息的本地化6. 实现远程验证7. 自定义验证方法8. 验证表单完整版8.1 Html表单8.2 表单验证js逻辑8.3 表单验证css样式 1. 写在前面 我们知道&#x…

windows11经常断网WiFi

解决方法&#xff1a;从官方网站下载&#xff0c;更新WiFi驱动程序&#xff0c;

Linux:apache优化(2)—— 网页传输压缩

网页传输压缩 客户端在请求httpd服务器数据&#xff0c;httpd服务器在返回数据包给客户端时&#xff0c;先对返回的数据进行压缩&#xff0c;压缩之后再传输 作用&#xff1a;配置 Apache 的网页压缩功能&#xff0c;是使用 Gzip 压缩算法来对 Apache 服务器发布的网页内容进行…

AI又进化了,AI 写代码工具

今年 AI 的发展可谓一日千里&#xff0c;相信不少同学应该都用过 AI 来帮助自己提高开发效率吧&#xff1f; 比如让 AI 根据注释生成代码、解释整段代码、提供技术问题的答疑、修改 Bug、生成单元测试等等。 在 12 月 28 日刚刚结束的 WAVE SUMMIT 深度学习开发者大会上&…

STM32CubeMX教程8 TIM 通用定时器 - 输出比较

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化函数调用流程 3.2.2、外设中断函数调用流程 3.2.3、添加其他必要代码 4、常用函数 5…

Mysql 容易忘的 sql 指令总结

目录 一、操作数据库的基本指令 二、查询语句的指令 1、基本查询语句 2、模糊查询 3、分支查询 4、 分组查询 5、分组查询 6、基本查询总结&#xff1a; 7、子查询 8、连接查询 三、MySQL中的常用函数 1、时间函数 2、字符串函数 3、聚合函数 4、运算函数 四、表…

Leetcode 63 不同路径 II

题意理解&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 要求&#xff1a;机器人只能…

Jmeter学习总结(4)——提取接口响应内容JSON Extractor

后置提取常见的方式&#xff1a;正则表达式和JSON Extractor。 而接口响应大多是JSON格式。 在JSON提取器之前&#xff0c;可以根据响应结果去编写所需要的JSON表达式&#xff0c;在结果树中选择JSON PATH TESTER。 {"server_time": 1232333333333,"data&quo…