深入Mysql-03-MySQL 表的约束与数据库设计

文章目录

  • 数据库约束的概述
    • 约束种类
      • 主键约束
      • 唯一约束
      • 非空约束
      • 默认值
      • 外键约束
  • 表与表之间的关系
  • 数据库设计

数据库约束的概述

对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。

约束种类

约束名约束关键字
主键primary key
唯一unique
非空not null
外键foreign key
检查约束check 注:mysql 不支持

主键约束

用来唯一标识数据库中的每一条记录

  • 主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。

创建主键:

  1. 在创建表的时候给字段添加主键
    字段名 字段类型 PRIMARY KEY
  2. 在已有表中添加主键
    ALTER TABLE 表名 ADD PRIMARY KEY(字段名);

代码示例:

create table stu (id int primary key,name varchar(20),age int
)

在这里插入图片描述
删除主键约束:
alter table stu drop primary key;
在这里插入图片描述
在这里插入图片描述
主键自增:
主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值
将stu表中的主键进行添加操作:
alter table stu add primary key(id)
在这里插入图片描述
添加主键自增操作:
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
插入几条数据看看效果:

-- 插入数据
insert into stu (name,age) values ('小乔',18); 
insert into stu (name,age) values ('大乔',20);
-- 另一种写法
insert into stu values(null,'周瑜',35);

在这里插入图片描述
可以看到我们的主键id字段是逐渐递增的。

修改自增长的默认值起始值:

  • 创建表时指定起始值
CREATE TABLE 表名(列 名 int primary key AUTO_INCREMENT
) AUTO_INCREMENT=起始值;
-- 指定起始值为 1000 
create table stu1 (id int primary key auto_increment, name varchar(20)
) auto_increment = 1000;insert into stu1 values (null, '孔明');
select * from stu1;

在这里插入图片描述

  • 创建好以后修改起始值
ALTER TABLE 表名  AUTO_INCREMENT=起始值;
alter table stu1 auto_increment = 2000;
insert into stu1 values (null, '刘备');

在这里插入图片描述
注意: delete删除的记录对自增长没有影响,但是使用truncate删除记录时,自增长会重新开始。

唯一约束

表中某一列不能出现重复的值

字段名 字段类型 UNIQUE
  • 创建一个stu2表
create table stu2 (id int,name varchar(20) unique
)
  • 插入一条数据
insert into stu2 values (1, '张三');
  • 插入一条同样的数据
insert into stu2 values (1, '张三');

在这里插入图片描述
出现了错误: Duplicate entry '张三' for key 'name'

非空约束

某一列不能为 null

字段名 字段类型  NOT NULL
  • 创建一个stu3表
create table stu3(id int,name varchar(20) not null, gender char(1)
)
  • 添加一个数据
insert into stu3 values (1,'张三疯','男');
  • 添加一个name为null的数据
insert into stu3 values (2,null,'男');

出现了错误:Column 'name' cannot be null

默认值

字段名 字段类型  DEFAULT 默认值
  • 创建一个stu4表
create table stu4 ( id int,name varchar(20),address varchar(20)	default '广州'
)
  • 添加一条默认地址数据
insert into stu4 values (1, '李四', default); 
  • 添加一个非默认地址的数据
insert into stu4 values (3, '李四光', '深圳');

在这里插入图片描述

外键约束

创建一个员工表emp

CREATE TABLE emp (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(30),age INT,dep_name VARCHAR(30),dep_location VARCHAR(30)
);-- 添加数据
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州'); 
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州');
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳'); 
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳'); 
INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');

在这里插入图片描述
出现了大量冗余数据,解决方案就是进行分表

  1. 创建一个部门表
create table department(id int primary key auto_increment,dep_name varchar(20),dep_location varchar(20)
);
  1. 创建一个员工表
-- 创建员工表(id,name,age,dep_id)
-- 多方,从表
create table employee(id int primary key auto_increment,name varchar(20),age int,dep_id int	-- 外键对应主表的主键
)
  1. 添加俩个部门
insert into department values(null, '研发部','广州'),(null, '销售部', '深圳'); 
  1. 添加一些员工
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT	INTO	employee	(NAME,	age,	dep_id)	VALUES	('李四',	21,	1);
INSERT	INTO	employee	(NAME,	age,	dep_id)	VALUES	('王五',	20,	1);
INSERT	INTO	employee	(NAME,	age,	dep_id)	VALUES	('老王',	20,	2);
INSERT	INTO	employee	(NAME,	age,	dep_id)	VALUES	('大王',	22,	2);
INSERT	INTO	employee	(NAME,	age,	dep_id)	VALUES	('小王',	18,	2);
  1. 查询员工和部门
    在这里插入图片描述
    在这里插入图片描述
    这里我们可以看到部门id对应有部门信息,但是这里我们可以查润一条当前部门表不存在的id数据,这就要通过外键约束来解决了。
  • 创建表的时候添加外键: [CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)
  • 已有表增加外键:ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);

这里我们已经创建了表,那么我们使用第二种方式来创建外键约束。

alter table employee add constraint emp_depid_fk foreign key (dep_id) references department(id)

在这里插入图片描述
这里可以看到当我们赋予外键约束的时候无法创建出部门表里面没有的id记录。

删除外键:

ALTER TABLE 从表  drop foreign key 外键名称;
-- 删除 employee 表的 emp_depid_fk 外键
alter table employee drop foreign key emp_depid_fk;

外键的级联:
重新添加外键约束:

alter table employee add constraint emp_depid_fk foreign key (dep_id) references department(id);

当我们想改以下部门表的id时,会出现如图问题。
在这里插入图片描述
因此我们需要进行级联操作(在修改和删除主表的主键时,同时更新或删除副表的外键值)。

级联操作语法描述
ON UPDATE CASCADE级联更新,只能是创建表的时候创建级联关系。更新主表中的主键,从表中的外键列也自动同步更新
ON DELETE CASCADE级联删除

示例:


drop table employee;create table employee(
id int primary key auto_increment, name varchar(20),
age int,
dep_id int,	-- 外键对应主表的主键
-- 创建外键约束
constraint emp_depid_fk foreign key (dep_id) references department(id) on update cascade on delete cascade
)INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);

这时,我们对部门表进行删除操作。

drop table department;

在这里插入图片描述
出现了错误,无法删除或更新父行:外键约束失败。
我们对部门表进行更新操作来检测级联更新是否成功。

update department set id=10 where id=1; 

在这里插入图片描述
在这里插入图片描述
这里我们可以看到所有的id等于1的都被修改为10了。
最后我们删除部门号为10的来检测我们的级联删除是否成功。

delete from department where id=10;

在这里插入图片描述
可以看到我们的级联删除约束也是成功的。

表与表之间的关系

表与表之间的三种关系
一对多:最常用的关系 部门和员工(一个部门有多个员工)
多对多:学生选课表和学生表, 一门课程可以有多个学生选择,一个学生选择多门课程
一对一:相对使用比较少。员工表 简历表, 公民表 护照表

数据库设计

  1. 数据规范化
    建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储,这些规则就称为范式。
  2. 三大范式
    目前关系数据库有六种范式: 第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
  • 1NF: 第一范式每一列不可再拆分,称为原子性。
  • 2NF: 第二范式就是在第一范式的基础上所有列完全依赖于主键列。
  • 3NF: 任何非主列不得传递依赖于主键。

欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏,另外对编程感兴趣的友友们可以加以下群共同学习。群号:127871664

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

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

相关文章

go-kratos 学习笔记(3) google buf 管理proto

google buf 管理proto,以及从新归档文件的目录结构 什么是 BSR? BSR 将 Protobuf 文件作为版本化模块进行存储和管理,以便个人和组织可以轻松使用和发布他们的 API。 BSR 带有可浏览的 UI、依赖项管理、API 验证、版本控制、生成的文档以及…

稳居中科院2区的SCIEI双检索期刊,听说一投就中!

IEEE TRANSACTIONS ON ELECTRON DEVICES,中科院2区,JCR Q2, SCI&EI双检索期刊,年发文量在1000篇左右,且大有继续扩刊的走向。有投稿经验的作者反馈,比较容易被录用。 期刊信息 IEEE TRANSACTIONS ON ELECTRON DE…

Python 机器学习求解 PDE 学习项目——PINN 求解一维 Poisson 方程

本文使用 TensorFlow 1.15 环境搭建深度神经网络(PINN)求解一维 Poisson 方程: − Δ u f in Ω , u 0 on Γ : ∂ Ω . \begin{align} -\Delta u & f \quad & \text{in } \Omega,\\ u & 0 \quad & \text{on } \Gamma:\partial \Om…

非对称加密算法RSA的OpenSSL代码实现Demo

目录 1 RSA简介 1.1 RSA算法介绍 1.2 RSA算法的速度与安全性 1.3 RSA存储格式 1.3.1 PKCS#1 标准主要用于 RSA密钥,其RSA公钥和RSA私钥PEM格式 1.3.2 PKCS#8 标准定义了一个密钥格式的通用方案,其公钥和私钥PEM格式 2 OpenSSL代码实现 2.1 生…

初学51单片机之指针基础与串口通信应用

开始之前推荐一个电路学习软件,这个软件笔者也刚接触。名字是Circuit有在线版本和不在线版本,这是笔者在B站看视频翻到的。 Paul Falstadhttps://www.falstad.com/这是地址。 离线版本在网站内点这个进去 根据你的系统下载你需要的版本红线的是windows…

第九讲:POU与变量基础

POU(Program Organization Unit)的分类 一、定义及分类 POU即程序组成单元 二、三种POU的作用 1、功能/功能快:看作算法 功能块的POU是比较复杂的指令 三、功能块POU和功能POU的区别 1、理解功能POU(对比) 不添加实例名,就不需要去建立变量,所以就不会占到内存。 因…

算法题目整合4

文章目录 122. 大数减法123. 滑动窗口最大值117. 软件构建124. 小红的数组构造125. 精华帖子126. 连续子数组最大和 122. 大数减法 题目描述 以字符串的形式读入两个数字,编写一个函数计算它们的差,以字符串形式返回。输入描述 输入两个数字&#xff…

物联网专业创新人才培养体系的探索与实践

一、引言 随着物联网(IoT)技术的迅猛发展,物联网领域的人才需求日益增加。物联网技术作为新一轮信息技术革命的核心,已经渗透到社会生活的各个领域,对推动经济转型升级、提升国家竞争力具有重要意义。因此&#xff0c…

VUE之---slot插槽

什么是插槽 slot 【插槽】, 是 Vue 的内容分发机制, 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素, 而这一个标签元素是否显示, 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…

自己开发软件实现网站抓取m3u8链接

几天前一个同学说想下载一个网站的视频找不到连接,问我有没有什么办法,网站抓取m3u8链接 网页抓取m3u8链接。当时一听觉得应该简单,于是说我抽空看看。然后就分析目标网页,试图从网页源码里找出连接,有的源代码直接有,但是有的没有…

Java二十三种设计模式-代理模式模式(8/23)

代理模式:为对象访问提供灵活的控制 引言 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代替或占位符,以控制对它的访问。 基础知识,java设计模式总体来说设计模式分为三大类&#…

Varjo XR-4系列现已获得达索3DEXPERIENCE平台官方支持

近日,全球领先的工业虚拟和混合现实解决方案提供商Varjo宣布,Varjo XR-4系列现已获得达索3DEXPERIENCE平台的本地支持。这种集成为工程师和设计师带来了先进的虚拟和混合现实功能,他们可以通过沉浸式技术创新并简化他们的3D工作流程。 在达索…

【iOS】Tagged Pointer

目录 前言什么是Tagged Pointer?引入Tagged Pointer技术之前引入Tagged Pointer之后总结 Tagged Pointer原理(TagData分析)关闭数据混淆MacOS分析NSNumberNSString iOS分析 判断Tagged PointerTagged Pointer应用Tagged Pointer 注意点 Tagge…

Qt绘制指南针(仪表盘绘制封装使用)

指南针是一种用来确定方向的工具。它由一个磁针制成,其一端被磁化,可以自由旋转。当放置在水平面上时,磁针会指向地球的磁北极。通过观察磁针的指向,我们可以确定地理北方的方向。本示例是在Qt中绘制一个指南针,通过继…

Android WebViewClient 的 `shouldOverrideUrlLoading` 方法

简介 在Android开发中,WebView是一个强大的工具,可以在你的应用中显示网页内容。了解 WebViewClient 中的 shouldOverrideUrlLoading 方法是至关重要的,因为这个方法允许你控制 URL 在 WebView 中的处理方式。 在本文中,我们将详…

S71200 - 笔记

1 S71200 0 ProfiNet - 2 PLC编程 01.如何零基础快速上手S7-1200_哔哩哔哩_bilibili 西门子S7-1200PLC编程设计学习视频,从入门开始讲解_哔哩哔哩_bilibili

Linux:进程信号(一.认识信号、信号的产生及深层理解、Term与Core)

上次结束了进程间通信的知识介绍:Linux:进程间通信(二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量 文章目录 1.认识信号进程看待信号方式 2.信号的产生2.1信号的处理的方式 --- signal()函数2.2kill指令产生信号2.3键盘产生…

最新快乐二级域名分发系统重置版v1.7源码-最新美化版+源码+可对接支付

源码简介: 最新快乐二级域名分发系统重置版v1.7源码,它是最新美化版源码可对接支付。 快乐二级域名分发系统重置版v1.7源码,简单快捷、功能强大的控制面板。系统稳定长久,控制面板没任何广告,让网站更实用方便。 最…

现货白银交易中spring形态的应用

在现货白银市场中交易想取得成功并从市场中获利,掌握一些工具是必不可少的,而今天我们要介绍的现货白银的交易工具就是spring形态。 对于spring这个英文,我们都很熟悉,它有春天的意思,但这里所说的spring形态并不是指春…

ComfyUI进阶:Comfyroll节点 (最终篇)+应用实例

前言: 学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业的图像生成与编辑工具。借助这些节点,用户可以在静态图像的精细调整和动态动画的复杂构建…