【MySQL】表的约束——空属性、默认值、列描述、zerofill、主键、自增长、唯一键、外键

文章目录

  • MySQL
  • 表的约束
    • 1. 空属性
    • 2. 默认值
    • 3. 列描述
    • 4. zerofill
    • 5. 主键
    • 6. 自增长
    • 7. 唯一键
    • 8. 外键

MySQL

在这里插入图片描述

  

表的约束

  MySQL中的表的约束是一种规则,用于限制或保护表中数据的完整性和合法性。约束可以确保数据在插入、更新或删除时满足特定的条件,从而维护数据的正确性和一致性。

1. 空属性

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

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

创建一个数据表其中的id1为NULL,id2为NOT NULL:

create table test1(id1 int null,id2 int not null);

在这里插入图片描述
  

查看表中的结构:

desc test1;

在这里插入图片描述

我们看到对于数据id1,是可以填写NULL值的,而id2则无法填写空值。

  

向test1插入不同的数据并且打印:

insert into test1(id1,id2) values(10,20); // 插入成功
 
insert into test1(id2) values(20); // 插入成功,id1可以为空值

insert into test1(id1) values(20); // 插入失败,id2不可以是空值
//ERROR 1364 (HY000): Field 'id2' doesn't have a default value

在这里插入图片描述

在这里插入图片描述

  所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。

  

2. 默认值

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

  注意:not null和defalut一般不需要同时出现,因为default本身有默认值,不会为空。

创建一个表,包含不能为空的姓名,默认值为0的年龄,默认值为男的性别:

mysql> create table test2(
    -> name varchar(20) not null,
    -> age tinyint unsigned default 0,
    -> sex char(2) default '男'
    -> );

在这里插入图片描述
  

查看表中的结构:

desc test2;

在这里插入图片描述

  可以看到我们的年龄和性别都成功的设置好了默认值0和男。当我们在插入数据的时候不给该字段赋值,就使用默认值。

  

向表中插入数据并打印:

mysql> insert into test2(name,age,sex) values('张三',18,'男');
mysql> insert into test2(name,age,sex) values('小红',20,'女');
mysql> insert into test2(name,age) values('李四',22); // 只使用sex的默认值
mysql> insert into test2(name) values('王五'); // 只填了姓名,使用age和sex的默认值

在这里插入图片描述

  

3. 列描述

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

创建和上面类似的代码同时加上列描述:

mysql> create table test3(
    -> name varchar(20) not null comment '姓名',
    -> age tinyint default 0 comment '年龄',
    -> sex char(2) default '男' comment '性别'
    -> );

  

此时不能desc查看到列描述,但是可以使用show操作:

desc test3;
show create table test3\G

在这里插入图片描述

在这里插入图片描述

  

4. zerofill

  zerofill:将自动为该列的值填充前导零,以确保该列的总宽度(包括符号位,如果有的话)与列定义中指定的显示宽度相匹配,类似一种格式化输出。

创建一张表,其中int类型a使用zerofill,而int类型b不加任何约束:

mysql> create table test4(
    -> a int(5) zerofill,
    -> b int(10)
    -> );

在这里插入图片描述

  

查看表的结构:

desc test4;

在这里插入图片描述

  

插入数据并且打印:

mysql> insert into test4(a,b) values(1,1);
mysql> insert into test4(a,b) values(10,20);
mysql> select * from test4;

在这里插入图片描述

  

  int既然是四个字节,那是否int(10)和int(5)是一样的呢?

  其实没有zerofill这个属性,括号内的数字是毫无意义的。这个数字并不代表该列可以存储的最大整数值或存储大小。相反,这个数字是所谓的“显示宽度”(display width),它主要用于控制当查询结果返回时该列的显示宽度。

我们使用十六进制查看a的数值:

mysql> select a,hex(a) from test4;

在这里插入图片描述

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

  

5. 主键

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

创建一张表,其中包括int类型的id和varchar类型的name,其中id为主键:

mysql> create table test5(
    -> id int unsigned primary key,
    -> name varchar(20)
    -> );

在这里插入图片描述

  

查看表结构:

desc test5;

在这里插入图片描述

  其中id的Key就标记上了主键标志PRI。

  

向表中插入数据并且打印:

mysql> insert into test5 values(1,'张三');
mysql> insert into test5 values(2,'李四');
mysql> insert into test5 values(3,'王五');

mysql> insert into test5 values(3,'赵六');
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'

在这里插入图片描述

在这里插入图片描述

  我们看到了当表中有id为3的数据时,此时在插入id=3的数据时就会直接报错,这样就很好的约束了我们表中由主键标记的数据是唯一的。

  

删除主键(id):

mysql> alter table test5 drop primary key;

在这里插入图片描述

  

如果创建的表中没有主键,我们可以向某一个字段(这里向id)追加主键:

alter table test5 add primary key(id);

在这里插入图片描述

  

上面,如果追加的字段有重复的字段,就无法继续追加主键,需要删除相同的字段:

  此时的表中有重复的id。

在这里插入图片描述

  因为有重复的id,所以添加主键失败。

在这里插入图片描述

  删除重复包含的id的数据。

在这里插入图片描述

  再次插入主键成功。

在这里插入图片描述

  

6. 自增长

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

  自增长的特点:

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

  (2)自增长字段必须是整数;

  (3)一张表最多只能有一个自增长。

  

创建一张表,其中的id为主键且自增长,name为varchar类型:

mysql> create table test6(
    -> id int primary key auto_increment,
    -> name varchar(10)
    -> );

在这里插入图片描述

  

查看表结构:

desc test6;

在这里插入图片描述

  

插入数据并且打印:

mysql> insert into test6 values(1,'张三');
mysql> insert into test6 values(2,'李四');
mysql> insert into test6(name) values('王五');

mysql> select * from test6;

在这里插入图片描述

  可以看到我们在没有输入id的时候,自增长会帮我们自动的向最大值进行+1操作。

  

7. 唯一键

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

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

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

  我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。 就像我们在学校一样,我们的学号就是我们的主键是唯一标识的,而学生的手机号设置为唯一键(可能会人没有手机号的情况)。

  学号字段是主键,它保证了每个学生都有一个唯一的学号,并且学号不能为空。手机号是唯一键,它确保了在这个表中手机号的唯一性。因为我们不会使用每个人的手机号做区分的标识。主键和唯一键不冲突,相互补充。

  

创建表,其中的id为主键,phone为唯一键:

mysql> create table test7(
    -> id int primary key,
    -> phone int unique
    -> );

在这里插入图片描述
  

查看表结构:

desc test7;

在这里插入图片描述
  

插入数据并且打印:

mysql> insert into test7 values(1,111);
mysql> insert into test7 values(2,222);
mysql> insert into test7 values(3,333);

mysql> insert into test7 values(4,333);
ERROR 1062 (23000): Duplicate entry '333' for key 'phone' // phone重复,直接报错

mysql> select *from test7;

在这里插入图片描述

  

8. 外键

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

在这里插入图片描述
  

创建主键表包含id和name:

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

  

创建从表包含id,name,class_id,外连接myclass的id:

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大神班');
mysql>  insert into stu values(100, '张三', 10),(101, '李四',20);

mysql> insert into stu values(102, 'wangwu',30); // 没有这个班级,插入失败
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`constraint_test`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `myclass` (`id`))
mysql> select* from myclass;
mysql> select* from stu;

在这里插入图片描述
  

笛卡尔积打印两张表的组合:

mysql> select* from stu,myclass;

在这里插入图片描述
  

筛选出有关联的数据:

mysql> select* from stu,myclass where stu.class_id=myclass.id;

在这里插入图片描述

  

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

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

相关文章

笨办法学 Python3 第五版(预览)(一)

原文:Learn Python the Hard Way, 5th Edition (Early Release) 译者:飞龙 协议:CC BY-NC-SA 4.0 模块 1:Python 入门 练习 0:准备工作 这个练习没有代码。这只是你完成的练习,让你的计算机运行 Python。…

Web开发学习-HTML

第一天 固定结构 如何注释&#xff1a;vs code中使用ctrl/可以达到注释这一行的效果&#xff0c;同时再次按下ctrl/&#xff0c;可以取消注释。 HTML标签的结构 例如&#xff1a;<strong>字体加粗</strong>这个就是双标签&#xff0c;<br>换行标签&#xff…

Unity 常用的4种灯光、制作镜子、灯光的调用修改数值、

创建灯光时&#xff0c;一般用4种&#xff1a;定向光、点光源、聚光、区域光、 定向光&#xff1a;太阳 点光源&#xff1a;灯泡 聚光灯&#xff1a;手电筒 区域光&#xff1a;烘焙-贴图 灯光选择已烘焙 需要先选择被烘焙的物体&#xff0c;然后再选择Contribute GI 等待进…

记录一次自己的服务器迁移过程

记录一次自己的服务器迁移过程 记录一次自己的服务器迁移过程 前言目前项目的部署方式开始迁移 提前准备设置安全组开始初始化安装 docker尝试部署数据库迁移 结尾一些问题 为什么中间没有配置 https?关于数据库备份 前言 最近阿里云发动了史上最大力度价格战&#xff0c…

hive中spark SQL做算子引擎,PG作为MetaDatabase

简介 hive架构原理 1.客户端可以采用jdbc的方式访问hive 2.客户端将编写好的HQL语句提交&#xff0c;经过SQL解析器&#xff0c;编译器&#xff0c;优化器&#xff0c;执行器执行任务。hive的存算都依赖于hadoop框架&#xff0c;所依赖的真实数据存放在hdfs中&#xff0c;解析…

详解 JavaScript 中的数组

详解 JavaScript 中的数组 创建数组 注&#xff1a;在JS中的数组不要求元素的类型&#xff0c;元素类型可以一样&#xff0c;也可以不一样 1.使用 new 关键字创建 let array new Array()2.使用字面量方式创建(常用) let array1 [1,2,3,"4"]获取数组元素 使用下…

用numpy搭建自己的神经网络

搭建之前的基础与思考 构建模型的基本思想&#xff1a; 构建深度学习的过程&#xff1a;产生idea&#xff0c;将idea转化成code&#xff0c;最后进行experiment&#xff0c;之后根据结果修改idea&#xff0c;继续idea–>code–>experiment的循环&#xff0c;直到最终训练…

Excel 按奇数偶数列处理数据

目录 一. 需求背景1.1 获取偶数列的数据1.2 奇偶列数据互换 二. 解决方式2.1 为列添加奇偶辅助列2.2 通过公式将奇偶列互换 一. 需求背景 1.1 获取偶数列的数据 ⏹ 最近在整理歌单&#xff0c;发现部分歌曲没有歌词&#xff0c;于是打算自己制作一份。 从网上找到了歌词&…

Vue前端的工作需求

加油&#xff0c;新时代打工人&#xff01; 需求 实现带树形结构的表格&#xff0c;父数据显示新增下级&#xff0c;和父子都显示编辑。 <template><div><el-table:data"tableData"style"width: 100%; margin-bottom: 20px"row-key"i…

YOLOv9独家原创改进|使用可改变核卷积AKConv改进RepNCSPELAN4

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 AKConv是一种具有任意数量的参数和任意采样形状的可变卷积核&#xff0c;对不规则特征有更好的提取效果。 RepNCSPELAN4是YOLOv9中的…

ArcGIS Runtime For Android开发之符号化和图层渲染

一、用Symbol对要素进行符号化 首先我们看一下Symbol 接口关系&#xff1a; 1、SimpleFillSymbol 他是用来进行简单的Graphic面要素填充符号化的&#xff0c;它可以设置要素的填充颜色&#xff0c;边线颜色、线宽&#xff0c;其用法如下&#xff1a; Polygon polygonnew Po…

python中的类与对象(3)

目录 一. 类的多继承 二. 类的封装 三. 类的多态 四. 类与对象综合练习&#xff1a;校园管理系统 一. 类的多继承 在&#xff08;2&#xff09;第四节中我们介绍了什么是类的继承&#xff0c;在子类的括号里面写入要继承的父类名。上一节我们只在括号内写了一个父类名&…

怎么删除CSDN上发布的文章(电脑版)

怎么删除CSDN上发布的文章(电脑版) 第一步&#xff1a;回到个人主页 第二步&#xff1a;点击右上角的“创作中心” 第三步&#xff1a;点击进去之后找到“管理”——“内容管理” 第四步&#xff1a;找到要删除的文章&#xff0c;点击右侧的三个小点点 第五步&#xff1a;然后…

js优雅的统计字符串字符出现次数

题目如下 统计一串字符串中每个字符出现的频率 示例字符串 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfd小白写法 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfdlet result {}; for (let i 0; i < str.length; i) {if (result[str[i]]) {result[str[…

了解游戏中的数据同步

数据同步 在联机游戏中&#xff0c;我的操作和数据要同步给同一局游戏中其他所有玩家&#xff0c;其他玩家的操作和数据也会同步给我。这叫做数据同步&#xff0c;目前数据同步的方式则有帧同步和状态同步。 状态同步&#xff1a;将操作发送给服务端&#xff0c;服务端对操作…

springboot-基础-eclipse打包jar包和war包的方法与排错

目录 打jar包打war包排错获取包外位置eclipse找不到*.jar 打jar包 修改 application-dev.yml spring.thymeleaf.prefixfile:./templates/ &#xff08;非必须&#xff01;如果遇到找不到模板的情况这样做&#xff09;把templates文件夹复制到jar文件同级的目录。 但是无法解…

Linux 基础IO(1)内存文件

文章目录 铺垫文件的系统调用接口文件描述符缓冲区 铺垫 文件文件内容 文件属性访问文件之前&#xff0c;都要先打开文件&#xff0c;而要访问&#xff0c;修改&#xff0c;编辑文件&#xff0c;文件就必须加载到内存中程序运行起来变成进程&#xff0c;被CPU调度&#xff0c;…

基于YOLOv的目标追踪与无人机前端查看系统开发

一、背景与简介 随着无人机技术的快速发展&#xff0c;目标追踪成为无人机应用中的重要功能之一。YOLOv作为一种高效的目标检测算法&#xff0c;同样适用于目标追踪任务。通过集成YOLOv模型&#xff0c;我们可以构建一个无人机前端查看系统&#xff0c;实现实时目标追踪和可视化…

构建高效的接口自动化测试框架思路

在选择接口测试自动化框架时&#xff0c;需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说&#xff0c;使用Python相关的测试框架更为便捷。无论选择哪种框架&#xff0c;重要的是确保 框架功能完备&#xff0c;易于维护和扩展&#xff0c;提高测试效率和准确性。今…

循序渐进,搞懂什么是回溯算法

循序渐进&#xff0c;搞懂什么是回溯算法 回溯算法简介 回溯算法&#xff08;backtracking algorithm&#xff09;实际上是一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#…