文章目录

  • 前言
  • 一、空属性
  • 二、默认值
  • 三、列描述
  • 四、zerofill
  • 五、主键
  • 六、自增长
  • 七、唯一键
  • 八、外键
  • 总结


前言

  真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。这就是表的约束由来~


一、空属性

  数据库默认字段基本都是允许为空的,但在实际开发中我们要尽可能保证字段不为空,因为空值无法参与运算。

在这里插入图片描述
  如果要让某个字段不允许为空,在创建表的时候就可以给对应字段设置 not null 属性。比如我们创建一个班级表,表当中包含班级名和该班级所在的教室,如果插入数据时不想让这两个字段为空,就可以在创建表时给这两个字段设置 not null 属性

create table if not exists myclass(class_name varchar(20) not null,class_room varchar(20) not null,other varchar(20)
);

在这里插入图片描述

在这里插入图片描述
  我们发现other这一列我们是只写了一个 varchar ,没有指定 not null ,默认是 null 的,然后面加了一个 default null
  这里表示你想插就插,不插这一类就给默认值null。

  那我们就来插入个数据试试水:

  改个配色方案了,之前一直黑底白字,现在改为白底黑字换个口味

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

所以说,如果某列设置了not null

  • 必须要插具体值
  • 不插因为后面没有默认值就报错
  • 插入null也报错

如果设置为默认null,可以不插用的是后面带的默认值。

二、默认值

  • 如果某一个字段会经常性的出现某个值,那么就可以考虑将这个值设置成该字段的默认值
  • 向表中插入数据时如果不给带有默认值的字段赋值,那么就会使用默认值进行插入

  可以说默认值的目的就是为了可以简化数据插入操作,提高数据一致性。

create table if not exists student(name varchar(20) not null,age tinyint unsigned default 18,gender varchar(10) default '男'
);

  在此表中,age 默认值为 18,gender 默认值为“男”。当插入数据时,如未指定这些列的值,将使用默认值

在这里插入图片描述
总结:default 和 not nul 并不冲突,而是互相补充的。

  • 当用户指明这一列要插的时候,受 null 和 not null 约束,要么插 null ,要么插合法数据。
  • 总之用户指明这一列要插 ,not null 来约束。
  • 当用户忽略这一列的时候,如果设置了默认值使用默认值,如果没有就直接报错。
  • 总结用户忽略这一列要插, default 来约束

  如果建表的时候, 不给某一列添加任何约束,我们会发现MySQL会对 sql语句 优化,默认会带上default null。所以不插入的时候在表示会显示null。

三、列描述

  • comment:用于给列添加注释说明,便于程序员和数据库管理员理解字段用途。
  • 该属性不会对数据插入产生约束效果。
create table if not exists t5(name varchar(20) not null comment '用户的用户名',age tinyint unsigned default 18 comment '用户的年龄'
);

在这里插入图片描述

四、zerofill

  • zerofill:在数字前补零,使显示字符长度符合指定的位数。
  • 数据库存储的 数值不变,仅用于展示效果。
create table if not exists t6(a int unsigned not null,b int unsigned zerofill not null
);

在这里插入图片描述
  这个 int(10) unsigned zerofill 的 10 意味着什么呢?请看下文
在这里插入图片描述
  我们会发现,zerofill 还是挺形象的,填满 0~
  如果以后你想显示出的是001,002就可以设置zerofill。

  这里其实有个小细节,为什么 int() 后面带的是 10 ?更准确的是为什么 unsigned int() 是10,int() 是11?

  int占4个字节,有符号取值范围 -2^31 - 2^31-1,无符号取值范围 2^32-1,无论是 2^31,还是 2^32 转成10进制是21亿多,42亿多,这么大的数字其实最后表示处理也就是10位,8位千万,9位亿,10位十亿。

  用10就可以把所有整数数据位全都表示出来。

  而 int 多出一个1是因为它是有符号的,多一位标识符号位。

五、主键

  • primary key:用于标识表中的唯一记录,不允许重复或为空。
  • 表中最多只能有一个主键列。
  • 主键可以通过复合主键的方式使用多列联合唯一标识。
create table if not exists t8(id int unsigned primary key,name varchar(20) not null
);

  在此示例中,id 被设为主键,数据库自动为主键列添加 not null 约束。

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

  • 主键约束对于程序员来讲,未来想往这个表里面插对应插入的数据主键列不能冲突,一旦冲突不让你插入,所以倒逼程序员插的时候尽量不要出现主键冲突。
  • 其次站在 mysql视角 凡是插入这个表里面的数据主键一定是不冲突的。这样的好处是根据主键绝对能拿出来确定的一条记录!–唯一性
  • 有了主键可以有针对性的对数据进行增删查改

在这里插入图片描述
创建主键有两种方法:

  • 创建表的时候就把主键设置好
  • 表建好之和但没有主键,可以追加主键

接下来就是删除 | 添加 主键的SQL 语句
在这里插入图片描述

  • 虽然一张表中最多只能有一个主键,但是并不意味着一个表中的主键只能添加给一列!
  • 也就是说一个主键可以被添加到一列,或者多列上。
  • 一个主键被添加到多列上的数据我们就叫做复合主键

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

  下面我们就可以用两列合起来当一个主键,如创建一张表让一个学生不能选修同样的课程

create table t9(id int unsigned,course_id int unsigned comment '课程编号',score tinyint unsigned comment '课程得分',primary key(id,course_id));

  可以看到 id 和 course_id 都叫做主键。

在这里插入图片描述
  因为一位同学可以选修多门课,而一门课又可以被多位同学选,所以我们把 学生id 和 课程id 合为一个主键,这就是复合主键的一个实际运用

在这里插入图片描述

  • 换言之,可以选择一列作为主键,也可以选择多列作为主键
  • 但是多个合起来做一个主键,都不一样可以插,有一个不一样可以插,只有多个同时和历史数据一样才会出现主键冲突。 这就是复合主键。
  • 复合主键理解:将多列看成一个整体,全部同时冲突,才会约束
  • 后面可以支持通过主键进行快速查找。

六、自增长

就是字段自动增长,从当前最大值加 1,通常配合主键使用,确保值唯一。

  • 任何一个字段要做自增长,前提:本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长
create table t10(id int unsigned primary key auto_increment,name varchar(20) not null
);
create table t10(id int unsigned primary key auto_increment,name varchar(20) not null
);

在这里插入图片描述
  在此示例中,id 列自增长,无需显式插入,系统自动为其赋值。

在这里插入图片描述
  插入时,我们可以指定插入其他列,id这一列就不管了。可以看到虽然我并没有告诉id要插什么,但是id是自动帮我们插入的,并且是增长的。

  和别人不冲突并且连续的,这就是自增长主键。

  当我们指定id要插入的时候,也能插进行。然后再插入id相同值的时候,确实能够履行主键的职责发生主键冲突。

自增主键的插入机制

  • 默认行为:自增主键在插入时若未设置任何默认值,则默认从1开始插入。
  • 手动设置起始值:如果手动插入一个新的起始值,且该值大于历史值,则自增主键将从新的起始值开始进行插入。
  • 创建表时,除了在表内设置 auto_increment约束外 ,还可以在表外 设置auto_increment 的值,这代表下一次插入的起始值。
  • 可以使用 last_insert_id() 函数来获取最后一次插入的 AUTO_INCREMENT 值。

七、唯一键

  在一张表中,唯一键用于对多个需要唯一性约束的字段进行限制。虽然表中只能有一个主键,但可以使用多个唯一键来确保数据唯一性。

区别:

  • 主键:标识唯一性,主要用于唯一标识记录。
  • 唯一键:更多地用于业务逻辑上的唯一性约束,允许字段为空,并且多个空值不会影响唯一性比较。
mysql> create table student (-> id char(10) unique comment '学号,不能重复,但可以为空',-> name varchar(10)-> );mysql> insert into student(id, name) values('01', 'aaa');
mysql> insert into student(id, name) values('01', 'bbb'); -- 触发唯一约束错误
ERROR 1062 (23000): Duplicate entry '01' for key 'id'mysql> insert into student(id, name) values(null, 'bbb'); -- 允许为空

在这里插入图片描述

  唯一键和主键不冲突,可以理解为对主键的补充设置,并且只能有一个主键,但可以有多个唯一键

八、外键

对于外键,我们主要理解两个内容:

  • 从表和主表的关联关系
  • 产生外键约束

外键用于确保表间数据的一致性,例如防止插入一个不存在班级的学生或删除一个还有学生的班级。

  • 定义:外键约束用于建立主表和从表之间的关联关系,主要定义在从表上,主表必须包含主键或唯一键。

外键用于定义主表和从表之间的关系:

  • 外键约束主要定义在从表上
  • 主表则必须是有主键约束或unique约束
  • 当定义外键后,要求外键列数据必须在主表的主键列存在或为NULL

设置外键约束SQL语句:

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, '高三(9)班'),(20, '高三(19)班');-- 插入学生数据
mysql> insert into stu values(100, '张三', 10), (101, '李四', 20);-- 插入无效班级号的数据,触发外键约束错误
mysql> insert into stu values(102, '王五', 30); -- 无效插入

在这里插入图片描述
在这里插入图片描述
  可以看到,并不存在 id为30 的班级

  可以这么理解外键约束:通过外键约束将表间关系交由数据库管理,避免在业务上关联的表间出现不一致的数据。


总结

  通过学习上述内容,可以交给大家一个数据库作业《商店数据库设计》,要求如下,大家可以自行完成并掌握!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis:SQL与Java的智能桥梁

MyBatis:SQL 与 Java 的「智能翻译官」 —— 用 极简的方式 连接数据库和 Java 对象,告别 JDBC 的繁琐操作!核心定位:半自动化 ORM 框架对比项JDBC 原生操作MyBatis 解决方案SQL 编写拼字符串(易出错、难维护&#xff…

自动驾驶控制系统

目录 控制系统概述 无人车控制架构设计 自动驾驶控制核心技术 车辆纵向控制 车辆横向控制 自动驾驶控制方法 自动驾驶控制技术方案 人机交互系统 控制系统概述 控制技术是智能驾驶的关键,旨在环境感知技术的基础之上,根据决策规划出目标轨迹,通过纵向和横向控制系统…

网络安全基石:从弱口令治理到动态防御体系的构建

引言:数字时代的防御困局 在5G与物联网技术全面落地的数字新基建时代,企业网络资产规模呈现指数级增长。Verizon《2023年数据泄露调查报告》显示,61%的安全事件直接源于凭证失窃,而其中81%的攻击成功案例可溯源至初始口令强度的不…

Error: fatal: detected dubious ownership in repository at

这个错误是 Git 在新版中引入的一种 安全检查机制,目的是防止不同用户访问同一个 Git 仓库目录,避免潜在的权限或安全问题。你的情况是:仓库目录是属于另一个用户。当前以管理员用户 OVERSPREAD/Administrator 运行 Git。Git 为了安全起见&am…

嵌入式 数据结构学习 (六) 树、哈希表与内核链表

一、树(Tree)结构详解1. 树的基本概念树的核心特性非线性结构:数据元素之间存在一对多的层次关系递归定义:树的子树仍然是树专业术语:度(Degree):结点拥有的子树数叶子结点:度为0的结点层次(Level):根为第1…

封装WebSocket

一个基于原生 WebSocket 的封装库,实现了自动重连、心跳检测等功能,用于在前端应用中稳定地与后端 WebSocket 服务通信。下面从设计思路、关键功能等方面进行详细分析:设计思路 这个封装库采用单例模式设计,全局维护一个 WebSocke…

SLICEGPT: COMPRESS LARGE LANGUAGE MODELSBY DELETING ROWS AND COLUMNS

发表:ICLR24 机构:ETH Zurich 连接:https://arxiv.org/pdf/2401.15024 ABSTRACT 大型语言模型(Large Language Models, LLMs)已成为自然语言处理的基石,但其使用伴随着在计算和内存资源方面的高昂代价。…

Python 【技术面试题和HR面试题】➕ 循环结构、控制语句及综合应用问答

1.技术面试题 (1)详细描述单调栈的工作原理和应用场景 答: 原理 维护栈内元素单调递增 / 递减,新元素入栈前,弹出破坏单调性的栈顶,保持单调。 应用场景 排队比身高,搭积木找最大的空地 &#x…

100G系列光模块产品与应用场景介绍

在当今数字化时代,网络流量呈爆炸式增长,对数据传输速度和带宽的要求也越来越高。100G 光模块作为高速数据传输的关键组件,因其卓越的高速传输能力,已成为数据中心、云计算、企业网络以及 5G 通信网络等领域的重要组成部分。接下来…

运筹说 第140期 | 从直觉到算法:这些奠基人如何塑造了启发式方法的科学根基?

运筹说建构知识体系,解析学习要点运 筹 优 化 领 域 教 学 媒 体视频课程已上线!!!欢迎大家关注同名抖音和哔哩哔哩账号!在人工智能与优化科学的浩瀚星空中,启发式算法如同一把钥匙,为人类打开了处…

Flutter编译安卓应用时遇到的compileDebugJavaWithJavac和compileDebugKotlin版本不匹配的问题

记一次flutter应用,编译安卓时,报的一个compileDebugJavaWithJavac和compileDebugKotlin版本本匹配的问题。 最终定位的原因是项目一来了audioplayers组件。 audioplayers组件有依赖了audioplayers_android, 它使用1.8编译的。 版本过低。后来…

linux-权限管理

linux-权限管理一、权限的基本类型二、权限的表示方式1. 字符形式(rwx)2. 数字形式三、权限管理常用命令1. chmod2. chown3. chgrp四、隐藏权限1. lsattr2. chattr五、权限掩码六、特别权限位1. suid2. sgid3. Sticky Bit七、权限委托1. 授权用户2. 授权…

从FCOS3D到PGD:看深度估计如何快速搭建你的3D检测项目

【导读】 还记得那个曾经在单目3D目标检测领域掀起热潮的 FCOS3D 吗?在后续更新中他们又推出了全新升级版——PGD(Probabilistic and Geometric Depth)最有意思的是,这次他们彻底换了路线:从原先的“直接回归深度”&a…

Apache Cloudberry 向量化实践(三)重塑表达式构建路径:Gandiva 优化实战

在向量化执行系统中,表达式构建是不可或缺的基础环节。无论是 SQL 中的投影、筛选,还是分区、聚合、排序,最终都需转化为底层执行引擎能识别和执行的表达式树。而在 Apache Cloudberry 向量化执行框架中,这一过程由 Gandiva 表达式…

Windows删除文件或者拔出U盘显示正在使用/占用解决办法

1、复制文件地址2、打开任务管理器,选择左侧【性能】3、打开资源监视器4、选择资源监视器中的CPU5、粘贴你复制的占用文件地址6、除了explore.exe以外,其他的关联的句柄都选中,然后右键结束

自由学习记录(68)

🧠 blender为什么不用 M 或 T? 键位含义为什么没选MMove?其实被用作「Move to Collection」等功能不符合历史定义,而且功能太多了TTransform? 但 transform 是一个总称(含移动、旋转、缩放)T 被…

ReactNative【实战系列教程】我的小红书 8 -- 我(含左侧弹窗菜单,右下角图标等)

最终效果点左上角菜单按钮,弹出左侧菜单后代码实现app/(tabs)/mine.tsx import icon_add from "/assets/icons/icon_add.png"; import mine_bg from "/assets/images/mine_bg.png"; import Heart from "/components/Heart"; import a…

C++性能优化实战:从理论到落地的五大核心策略

在当今这个对计算效率要求极高的时代,C作为系统级编程语言的王者,其性能优化能力依然是无可替代的核心竞争力。本文将分享我在大型分布式系统开发中积累的C性能优化实战经验,这些经验帮助我们将关键组件的吞吐量提升了300%,延迟降…

字节 Seed 团队联合清华大学智能产业研究院开源 MemAgent: 基于多轮对话强化学习记忆代理的长文本大语言模型重构

🔥 最新动态!!! [2025/07] 我们提供了快速启动脚本,让使用MemAgent变得超级简单,详情请见下方"快速入门"部分。[2025/06] 我们发布了RL-MemAgent-14B和RL-MemAgent-7B模型,在350万token上下文任务中实现了近乎无损的性…

【unitrix】 4.20 类型级二进制数减法实现解析(sub.rs)

一、源码 这段代码实现了一个用于统计二进制补码整数位数的系统,支持多种自定义数值类型(Z0、P1、N1、B0、B1)。 use core::mem::size_of; use crate::number::{Z0, P1, N1, B0, B1, Var};/// 统计二进制位数的 trait pub trait BitLength {f…