4-表约束和表设计

news2024/11/26 1:55:35

目录

1.表约束

1.1.什么是表约束?

1.2.为什么需要表约束?

1.3.常见的表约束

1.3.1.非空约束 not null

--->a.查看非空约束

--->b.验证非空约束

1.3.2.唯一约束 unique

--->a.查看唯一约束

--->b.验证唯一约束

--->PS:给某个字段只创建了唯一约束,没有指定非空约束。问:①这个字段能否插入NULL值?②若能插入NULL值,能否重复插入多个NULL值?③这个字段能否插入空值/空串('')?④若能插入空值,能否重复插入多个空值?

1.3.3.主键约束 primary key

--->语法1:单个字段-独立主键

--->语法2:单个字段/多个字段-联合主键

--->PS:(常见面试题)主键约束 VS 唯一约束

1.3.4.外键约束 foreign key

1.3.5.检查约束 check(了解)

1.3.6.自增约束 auto_increment

--->注:

--->a.查看自增值

--->b.手动设置自增值(创建表时)

--->c.修改自增值

--->d.delete 和 truncate 重置自增验证(默认引擎InnoDB下)

1.3.7.默认约束 default

--->PS:时间类型的数据插入与查询:

--->PS:一种特殊的插入方法:insert......select......

2.表设计

2.1.数据库设计三范式

①第一范式(确保每列保持原子性)

②第二范式(确保表中的每列都和主键相关)

③第三范式(确保每列都和主键列直接相关,而不是间接相关)

2.2.表关系

①⼀对⼀:⼀个学⽣对应⼀个学号。

②一对多:一个班级包含多个学生(用两张表表示)。

③多对多:一张表中的一条数据可以对应到另一张表的多条数据,反之也是这样的,这样的关系叫做多对多,⼀般⽤三个表表示。


1.表约束

1.1.什么是表约束?

表约束是在创建表的时候,设计⼀些表的约束条件,⽤来保证数据的合法性和数据的正确性。

例如:

  • ⼀个账号只能绑定⼀个⼿机号,那么⼿机号就不能重复被多个账号绑定使⽤,所以它应该设置唯⼀约束。
  • 主键是⽤来标识数据的,因此它不能为 NULL,也不能为空,所以它需要设置⾮空约束或主键约束,主键约束也不能为 NULL。

1.2.为什么需要表约束?

就像法律是⽤来规范⼈们的正确⾏为的⼀样,表约束也是为了规范程序员正确使⽤表的,但表约束是预先设置的,设置之后就对所有插⼊和修改⽴即⽣效,⽐如⾮空约束设置好之后,如果添加和修改为 NULL 值就会报错,这点是和法律有细微的不同。

如果没有表约束,会导致数据不正确,从⽽导致程序或现实中的业务⽆法推进和执⾏。

1.3.常见的表约束

PS:

在MySQL中通过指令查看当前时间,并把当前时间设为默认约束,这样在后面添加数据时,不指定createtime也没关系,系统会按照当前时间自动插入一个时间值。

create table 表名 (字段名 数据类型 [约束] [,字段名 数据类型 [约束]] ...);

1.3.1.非空约束 not null

字段名 数据类型 not null

创建的字段默认是可以为空的:

添加了⾮空约束之后,设置的字段就不能为空了,此约束可以⽤于⼀张表中的任意0到n个字段:

--->a.查看非空约束

desc 表名;

--->b.验证非空约束

1.3.2.唯一约束 unique

字段名 数据类型 unique

唯⼀约束就是对应字段的值是唯⼀的,不能重复,此约束可以⽤于⼀张表中的任意0到n个字段:

--->a.查看唯一约束

查看索引详情:

-- 以行的方式/表的方式展示
show keys from 表名; 

-- 以列的方式/key: value的方式展示
show keys from 表名\G;

--->b.验证唯一约束

--->PS:给某个字段只创建了唯一约束,没有指定非空约束。问:①这个字段能否插入NULL值?②若能插入NULL值,能否重复插入多个NULL值?③这个字段能否插入空值/空串('')?④若能插入空值,能否重复插入多个空值?

①能插入NULL值:

②能重复插入多个NULL值:

为什么NULL可以重复插⼊到唯⼀列中呢?

  • 因为NULL在mysql中⽐较特殊,这个NULL不是一个具体的值叫做"NULL",而是表示某个字段是没有值的。
  • NULL不代表任何值,它表示该值尚未插⼊。
  • 就像孙悟空⼀样,跳出三界外,不在五⾏中。

注意和带单引号的NULL(表示具体的一个值,值的内容为NULL,此时就不能重复插入多个了)区别:

③能插入空值(''):

④不能重复插入多个空值:

小结:

在MySQL中:NULL'''NULL'这三个是完全不同的!

  • NULL:不存在。使用is null或is not null来判断。
  • '':存在的。使用=''或!=''来判断。
  • 'NULL':存在的。使用='NULL'或!='NULL'来判断。

1.3.3.主键约束 primary key

主键是可以⽤来表示⼀张表中某条数据的代表凭证,例如对于“⼈”这张表来说,唯⼀的身份证就可以作为主键来代表这个⼈,“姓名”不⾏,因为姓名有可能会重复。

主键的特征:

  1. 主键可以由单个字段或多个字段(联合主键)组成。
  2. 主键不能插入NULL,可以插入空串,必须唯⼀。 (primary key = unique + not null)
  3. ⼀个表中只能有⼀个主键。

--->语法1:单个字段-独立主键

字段名 数据类型 primary key

--->语法2:单个字段/多个字段-联合主键

primary key(字段名 [,字段名]...)

联合主键只有当插入的多个字段都相同时,才会报错。

--->PS:(常见面试题)主键约束 VS 唯一约束

  • 一个表中:主键约束只能有⼀个,⽽唯⼀约束可以有多个。
  • 主键约束不能有 null 值,⽽唯⼀约束可以有 null,并且可以有多个 null。

1.3.4.外键约束 foreign key

外键⽤于关联其他表的主键或唯⼀键。

  • 主表:主键在主表里。
  • 次表:外键在次表里,外键关联到主表的主键上。
-- 在次表中写:
foreign key (外键字段名) references 主表(主键列名)

创建班级表class,id为主键:

创建学⽣表student,⼀个学⽣对应⼀个班级,⼀个班级对应多个学⽣。使⽤id为主键,classid 为外键,关联班级表id:

测试外键约束:

外键生效了!在次表进行数据插入时,会先去主表查询当前外键的有效性,若有效,才进行插入。

1.3.5.检查约束 check(了解)

检查约束是保证列中的值符合指定的条件,⽐如性别只能插⼊“男”或者“⼥”。

特殊说明:检查约束在 MySQL 8.0.15 以前约束不起作⽤,MySQL 8.0.16 才可以使⽤。

check(检查约束)

1.3.6.自增约束 auto_increment

字段名 数据类型 auto_increment

⾃增从 1 开始,每次递增 1。

auto_increment 列也可以显式指定值。

--->注:

①如果把一个NULL插入到一个auto_increment数据列里,MySQL将自动生成下一个序列编号。其执行逻辑和不设置自增列是一样的,会给自增列插入InnoDB里保存的自增最大值,而不会是NULL。

②当插入记录时,没有为auto_increment明确指定值,则等同插入NULL。

③一个表中只能有一个字段使用auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。

④auto_increment列必须为一个key(primary key、foreign key、unique),但不是一定要为主键,如果没有key就会报错。

唯⼀列可以为⾃增列:

外键也可以为⾃增列:

auto_increment不能只和not null一起使用:

⑤auto_increment约束的字段类型只能为整数类型(TINYINT、SMALLINT、INT、BIGINT 等)。

--->a.查看自增值

--->b.手动设置自增值(创建表时)

--->c.修改自增值

alter table 表名 auto_increment = 值;

:auto_increment 的值只能设置⽐⽬前存储的最⼤值⼤,否则设置不会⽣效:

--->d.delete 和 truncate 重置自增验证(默认引擎InnoDB下)

delete 不重置⾃增:

truncate 重置⾃增:

1.3.7.默认约束 default

默认约束是给没有给列赋值时的默认值。

字段名 数据类型 default '默认值'

--->PS:时间类型的数据插入与查询:

MySQL中任何数据类型都可以使用英文单引号括起来,so在不确定是什么数据类型时,可以加上单引号。

插入:

查询:

查询book图书表中,作者author列不为空,或者满足条件:价格price在50元以上且出版日期public_date在2019年之后的图书信息:

select * from book where author is not null or(price>50 and public_date>'2019-01-01 00:00:00');

--->PS:一种特殊的插入方法:insert......select......

insert into插入时,是根据列的顺序匹配查询结果的,不关注列名。

2.表设计

2.1.数据库设计三范式

①第一范式(确保每列保持原子性)

第⼀范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满⾜了第⼀范式。 第⼀范式的合理遵循需要根据系统的实际需求来定。

优点:

  1. 减少了数据冗余。
  2. 更利于数据的维护和更新。

⽐如某些数据库系统中需要⽤到“地址”这个属性,本来直接将“地 址”属性设计成⼀个数据库表的字段就⾏。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就⾮要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进⾏存储,这样在对地址中某⼀部分操作的时候将⾮常⽅便。这样设计才算满⾜了数据库的第⼀范式:

上表所示的⽤户信息遵循了第⼀范式的要求,这样在对⽤户使⽤城市进⾏分类的时候就⾮常⽅便,也提⾼了数据库的性能。

②第二范式(确保表中的每列都和主键相关)

第⼆范式在第⼀范式的基础之上更进⼀层。第⼆范式需要确保数据库表中的每⼀列都和主键相关,⽽不能只与主键的某 ⼀部分相关(主要针对联合主键⽽⾔)。也就是说在⼀个数据库表中,⼀个表中只能保存⼀种数据,不可以把多种数据保存在同⼀张数据库表中。

优点:

  1. 更利于数据的维护和修改。
  2. 更利于数据的完整展示。

⽐如要设计⼀个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键:

这样就产⽣⼀个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,⽽仅仅是与商品编号相关。所以在这⾥违反了第⼆范式的设计原则。 ⽽如果把这个订单信息表进⾏拆分,把商品信息分离到另⼀个表中,把订单数量表也分离到另⼀个表中,就⾮常完美了:

这样设计,在很⼤程度上减⼩了数据库的冗余。如果要获取订单的商品信息,使⽤商品编号到商品信息表中查询即可。

③第三范式(确保每列都和主键列直接相关,而不是间接相关)

第三范式需要在满足第一范式和第二范式的基础上,所有字段不能出现对非主键的依赖。确保数据表中的每⼀列数据都和主键直接相关,而不能间接相关。

优点:

  • 实现列和非主键列的解耦(一个优秀的设计理念:修改了一个字段,不会影响其他字段)

⽐如在设计⼀个订单数据表的时候,可以将客户编号作为⼀个外键和订单表建⽴相应的关系,⽽不可以在订单表中添加关于客户其它信息(⽐如姓名、所属公司等)的字段。下表不符合第三范式:

正确的表结构:

这样在查询订单信息的时候,就可以使⽤客户编号来引⽤客户信息表中的记录,也不必在订单信息表中多次输⼊客户信息的内容,减⼩了数据冗余。

2.2.表关系

表和表之间的关系有三种:

①一对一:一个学生对应一个学号。

②一对多:一个班级包含多个学生(用两张表表示)。

③多对多:一张表中的一条数据可以对应到另一张表的多条数据,反之也是这样的,这样的关系叫做多对多,一般用三个表表示。

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

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

相关文章

error处理:org.springframework.web.bind.MissingServletRequestParameterException

在工作中遇到错误org.springframework.web.bind.MissingServletRequestParameterException 此时为POST方法,添加了RequestParam注解,如图 postman中请求如下 解决办法:选择form-data进行传参即可

linux 设备树详解

设备树 描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。 树的主干就是系统总线&#x…

【服务器数据恢复】Linux系统下OA+oracle的数据恢复案例

服务器数据恢复环境: 某公司一台服务器中组建一组raid5磁盘阵列; 上层操作系统为linux redhat,部署OA系统,后端数据库为oracle。 服务器故障&初检: raid5中有2块磁盘先后掉线,服务器崩溃。oracle已经不…

springboot使用ECharts、ECharts html中文乱码、直接引用CDN资源文件和引用本地资源文件哪个好

springboot使用ECharts、动态地引用版本 1.添加依赖2.创建图表引入ECharts文件方式直接引用CDN资源文件和引用本地资源文件哪个好 3.映射4.添加配置加载ECharts资源5.测试访问6.升级版本号问题7.ECharts html中文乱码 如果想在Spring Boot应用程序中使用ECharts,则可…

多目标检测:基于Yolo优化的多目标检测(附论文下载)

关注并星标 从此不迷路 计算机视觉研究院 公众号ID|ComputerVisionGzq 学习群|扫码在主页获取加入方式 计算机视觉研究院专栏 作者:Edison_G 为了解决目标检测任务中小目标检测精度低、误检、漏检率高等问题,有研究者提出了一种新…

前端实战项目:网易云静态页面——主页面右侧部分

文章目录 前言main部分结构布局用户登陆右侧列表header的封装歌手列表主播列表申请按钮 总代码 前言 项目持续更新中~ 网易云静态页面——导航栏 网易云静态页面——轮播图 Flex布局详解 所用到文件及文件夹 header:是对某些标题样式的封装 main&…

软考A计划-重点考点-专题十一(系统工程知识)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

2023蓝桥杯真题c++省A

[蓝桥杯 2023 省 A] 填空问题 比赛的时候,脑袋要清晰一点,当时写 幸运数 这道题都感觉没在用脑子思考,花了特别多时间 A. 幸运数 小蓝认为如果一个数含有偶数个数位,并且前面一半的数位之和等于后面一半的数位之和,…

小家电类产品出口欧美国家/亚马逊平台认证要求请知悉!

小家电类产品CE认证 欧盟: “CE”标志是一种安全认证标志,被视为制造商打开并进入欧洲市场的护照。CE代表欧洲统一(CONFORMITE EUROPEENNE)。 根据欧盟的法律,生产商和进口商负责验证其产品符合相关的欧盟指令的要求…

哪款洗地机适合家用?家用洗地机型号分享

洗地机采用多种清洁方式,如湿拖、干拖、热水清洗等,可针对不同使用场合和地面类型进行清洁。而且洗地机无需手工操作,智能感应地面脏污,自动适应地面清洁程度,保证了清洁效率和效果。本文将为大家推荐几款性价比较高、…

三位一体,铸就无敌铁军!海陆空协同,开启集群新篇章!

在机器人领域,多机器人系统的研究一直是一大热点,众多高校与研究所逐步投入到机器人集群系统的研究当中,其中无人机编队表演、无人车群园区运输、无人船集群水域监测等集群应用更是进入了大众的视野。但对多机器人集群系统的需求却远不止于此…

「企业应用架构」应用架构行为准则

应用架构行为准则 应用程序架构是企业解决方案架构(ESA)的一个子集(图1)。应用程序架构既是一个过程(架构和设计)又是一个东西(可交付成果——架构的内容)。应用程序架构帮助组织规划…

Elasticsearch数据库

目录 1. 什么是ElasticSearch1.1 概念及特点1.2 ElasticSearch适用场景概述 2. 安装ElasticSearch2.1 下载安装包2.2 环境说明2.3 创建es的用户2.4 创建es存储位置2.5 安装es2.5 修改配置文件2.6 系统优化2.7 安装jdk环境2.8 切换es用户启动数据库2.9 systemctl管理2.10 访问 3…

听劝,不要什么都不懂就自学网络安全【黑客】

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…

SSL 证书安装使用中遇到的常见问题

为了实现网站HTTPS加密保护及身份的可信认证,防止传输数据的泄露或篡改,SSL证书已被各政企网站广泛应用。然而在部署和使用SSL证书的过程中,我们经常会遇到一些措手不及的问题,一旦处理不当,就会让网站面临信息被泄漏、…

Linux知识点 -- 常见指令及权限理解

Linux知识点 – 常见指令及权限理解 文章目录 Linux知识点 -- 常见指令及权限理解一、Linux下基本指令1.ls指令 - 列文件或目录信息2.pwd命令 - 显示用户当前所在目录3.cd指令 - 改变工作目录4.touch指令 - 更改文件时间或新建文件5.mkdir指令 - 创建目录 / tree - 以树状形式显…

Hbase入门篇02---数据模型和HBase Shell的基本使用

Hbase入门篇02---数据模型和基本使用 HBase数据模型表行列单元格 (cell)概念模型 shell命令行进行CRUD操作表的CRUD数据的CRUD数据批量导入计数操作大量数据的计数统计扫描操作limit限制返回条数返回指定列返回指定行键对应的数据 过滤器HBase中的过滤器…

【云原生进阶之PaaS中间件】第一章Redis-1.2数据类型

1 Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。…

XML配置方式使用Spring MVC:实战练习

文章目录 任务1、设置项目首页 - index.jsp1、修改web.xml文件2、创建首页文件3、修改登录控制器4、启动服务器,查看效果 任务2、首页添加登录链接,单击跳转到登录页面1、修改首页文件2、修改登录控制器3、启动服务器,查看效果 任务3、利用Sp…

预测性维护无线振动监测方案QA合集

一、虹科无线振动监测方案 虹科无线振动监测方案具有高安全性、高可靠性、全自动诊断的优势,广泛应用于各种旋转设备的故障诊断。虹科无线振动监测方案包括Accel 310高分辨率无线振动系统,用户能够实现每小时获取标量数据或每日诊断监控机器状态。借助先…