3、数据库中的约束数据库设计

news2024/11/26 14:39:47

约束

* 概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。    
* 分类:
    1. 主键约束:primary key
    2. 非空约束:not null
    3. 唯一约束:unique
    4. 外键约束:foreign key

* 非空约束:not null,某一列的值不能为null
    1. 创建表时添加约束
        CREATE TABLE stu(
            id INT,
            NAME VARCHAR(20) NOT NULL -- name为非空
        );
    2. 创建表完后,添加非空约束
        ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

    3. 删除name的非空约束
        ALTER TABLE stu MODIFY NAME VARCHAR(20);

drop table if exists stu;
create table  if not exists stu(
	id int,
	name varchar(20) not null -- name为非空
);
alter table stu modify name varchar(20);
-- insert into stu(id,name)values(1,null);
alter table stu modify name varchar(20) not null;
insert into stu(id,name)values(1,"张三丰");
select id,name from stu;

* 唯一约束:unique,某一列的值不能重复
    1. 注意:
        * 唯一约束可以有NULL值,但是只能有一条记录为null
    2. 在创建表时,添加唯一约束
        CREATE TABLE stu(
            id INT,
            phone_number VARCHAR(20) UNIQUE -- 手机号
        );
    3. 删除唯一约束
        ALTER TABLE stu DROP INDEX phone_number;
    4. 在表创建完后,添加唯一约束
        ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

#唯一约束
drop table if exists stu;
create table stu(
	id int,
	phone_number varchar(20) unique
);
alter table stu drop index phone_number;
alter table stu modify phone_number varchar(20) unique;
insert into stu(id,phone_number)values(1,"13512312312");
-- insert into stu(id,phone_number)values(1,"13512312312");
select id,phone_number from stu;

* 主键约束:primary key。
    1. 注意:
        1. 含义:非空且唯一
        2. 一张表只能有一个字段为主键
        3. 主键就是表中记录的唯一标识

    2. 在创建表时,添加主键约束
        create table stu(
            id int primary key,-- 给id添加主键约束
            name varchar(20)
        );

    3. 删除主键
        -- 错误 alter table stu modify id int ;
        ALTER TABLE stu DROP PRIMARY KEY;

    4. 创建完表后,添加主键
        ALTER TABLE stu MODIFY id INT PRIMARY KEY;

    5. 自动增长:
        1.  概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长

        2. 在创建表时,添加主键约束,并且完成主键自增长
        create table stu(
            id int primary key auto_increment,-- 给id添加主键约束
            name varchar(20)
        );

        3. 删除自动增长
        ALTER TABLE stu MODIFY id INT;
        4. 添加自动增长
        ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

#主键约束
drop table if exists stu;
create table stu(
	id int primary key,
	name varchar(20)
);
alter table stu drop primary key;
alter table stu modify id int primary key;
insert into stu(id,name)values(1,"张三丰");
-- insert into stu(id,name)values(1,"张三丰");
select id,name from stu;

#自动增长
drop table if exists stu;
create table stu(
	id int primary key auto_increment,
	name varchar(20)
);
alter table stu modify id int;
alter table stu modify id int auto_increment;
insert into stu(id,name)values(1,"张三丰");
insert into stu(id,name)values(null,"王祖贤");
select id,name from stu;

* 外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。
    1. 在创建表时,可以添加外键
        * 语法:
            create table 表名(
                ....
                外键列
                constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
            );

    2. 删除外键
        ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

    3. 创建表之后,添加外键
        ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

    4. 级联操作
        1. 添加级联操作
            语法:ALTER TABLE 表名 ADD CONSTRAINT 外键名称
                    FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE  ;
        2. 分类:
            1. 级联更新:ON UPDATE CASCADE
            2. 级联删除:ON DELETE CASCADE

#外键约束
drop table if exists emp;
create table if not exists emp(
	id int primary key auto_increment,
	name varchar(30),
	age int,
	dep_name varchar(30), 		-- 部门名称
	dep_location varchar(30)	-- 部门地址
);
insert into emp(id,name,age,dep_name,dep_location)values(1,"张三丰",20,"研发部","广州"),(2,"李四",21,"研发部","广州"),(3,"王五",20,"研发部","广州"),(4,"老王",20,"销售部","深圳"),(5,"大王",22,"销售部","深圳"),(6,"小王",18,"销售部","深圳");
select id,name,age,dep_name,dep_location from emp;

#员工表,多方,从表
drop table if exists employee;
create table if not exists employee(
	id int primary key auto_increment,
	name varchar(30),
	age int,
	dep_id int
);

#部门表,主表
drop table if exists department;
create table if not exists department(
	id int primary key auto_increment,
	dep_name varchar(30), 		-- 部门名称
	dep_location varchar(30)	-- 部门地址
);

insert into employee(name,age,dep_id) values("张三丰",20,1),("李四",21,1),("王五",20,1),("老王",20,2),("大王",22,2),("小王",18,2);
insert into department(dep_name,dep_location) values("研发部","广州"),("销售部","深圳");
-- select * from employee;
-- select * from department;


#部门表,主表
drop table if exists department;
create table if not exists department(
	id int primary key auto_increment,
	dep_name varchar(30), 		-- 部门名称
	dep_location varchar(30)	-- 部门地址
);
#员工表,多方,从表
drop table if exists employee;
create table if not exists employee(
	id int primary key auto_increment,
	name varchar(30),
	age int,
	dep_id int,
	constraint emp_dept_fk foreign key (dep_id) references department(id)
);
insert into department(dep_name,dep_location) values("研发部","广州"),("销售部","深圳");
insert into employee(name,age,dep_id) values("张三丰",20,1),("李四",21,1),("王五",20,1),("老王",20,2),("大王",22,2),("小王",18,2);
alter table employee drop foreign key emp_dept_fk;
-- insert into employee(name,age,dep_id) values("张四丰",20,5);
alter table employee add constraint emp_dept_fk foreign key(dep_id) references department(id);
-- insert into employee(name,age,dep_id) values("张四丰",20,5);
#操作麻烦
update employee set dep_id = null where dep_id = 1;
update department set id = 5 where id=1;
update employee set dep_id = 5 where dep_id is null;
-- 添加外键,设置级联更新
alter table employee drop foreign key emp_dept_fk;
alter table employee add constraint emp_dept_fk foreign key(dep_id) references department(id) on update cascade;
update department set id = 1 where id=5;
-- 添加外键,设置级联更新,设置级联删除
alter table employee drop foreign key emp_dept_fk;
alter table employee add constraint emp_dept_fk foreign key(dep_id) references department(id) on update cascade on delete cascade;
delete from department  where id=1;

select * from employee;
select * from department;

数据库的设计

1. 多表之间的关系
	1. 分类:
		1. 一对一(了解):
			* 如:人和身份证
			* 分析:一个人只有一个身份证,一个身份证只能对应一个人
		2. 一对多(多对一):
			* 如:部门和员工
			* 分析:一个部门有多个员工,一个员工只能对应一个部门
		3. 多对多:
			* 如:学生和课程
			* 分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择
	2. 实现关系:
		1. 一对多(多对一):
			* 如:部门和员工
			* 实现方式:在多的一方建立外键,指向一的一方的主键。
		2. 多对多:
			* 如:学生和课程
			* 实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键
		3. 一对一(了解):
			* 如:人和身份证
			* 实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键。

	3. 案例
		-- 创建旅游线路分类表 tab_category
		-- cid 旅游线路分类主键,自动增长
		-- cname 旅游线路分类名称非空,唯一,字符串 100
		CREATE TABLE tab_category (
			cid INT PRIMARY KEY AUTO_INCREMENT,
			cname VARCHAR(100) NOT NULL UNIQUE
		);
		
		-- 创建旅游线路表 tab_route
		/*
		rid 旅游线路主键,自动增长
		rname 旅游线路名称非空,唯一,字符串 100
		price 价格
		rdate 上架时间,日期类型
		cid 外键,所属分类
		*/
		CREATE TABLE tab_route(
			rid INT PRIMARY KEY AUTO_INCREMENT,
			rname VARCHAR(100) NOT NULL UNIQUE,
			price DOUBLE,
			rdate DATE,
			cid INT,
			FOREIGN KEY (cid) REFERENCES tab_category(cid)
		);
		
		/*创建用户表 tab_user
		uid 用户主键,自增长
		username 用户名长度 100,唯一,非空
		password 密码长度 30,非空
		name 真实姓名长度 100
		birthday 生日
		sex 性别,定长字符串 1
		telephone 手机号,字符串 11
		email 邮箱,字符串长度 100
		*/
		CREATE TABLE tab_user (
			uid INT PRIMARY KEY AUTO_INCREMENT,
			username VARCHAR(100) UNIQUE NOT NULL,
			PASSWORD VARCHAR(30) NOT NULL,
			NAME VARCHAR(100),
			birthday DATE,
			sex CHAR(1) DEFAULT '男',
			telephone VARCHAR(11),
			email VARCHAR(100)
		);
		
		/*
		创建收藏表 tab_favorite
		rid 旅游线路 id,外键
		date 收藏时间
		uid 用户 id,外键
		rid 和 uid 不能重复,设置复合主键,同一个用户不能收藏同一个线路两次
		*/
		CREATE TABLE tab_favorite (
			rid INT, -- 线路id
			DATE DATETIME,
			uid INT, -- 用户id
			-- 创建复合主键
			PRIMARY KEY(rid,uid), -- 联合主键
			FOREIGN KEY (rid) REFERENCES tab_route(rid),
			FOREIGN KEY(uid) REFERENCES tab_user(uid)
		);

2. 数据库设计的范式
    * 概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求

        设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
        目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

    * 分类:
        1. 第一范式(1NF):每一列都是不可分割的原子数据项
        2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
            * 几个概念:
                1. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
                    例如:学号-->姓名。  (学号,课程名称) --> 分数
                2. 完全函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
                    例如:(学号,课程名称) --> 分数
                3. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
                    例如:(学号,课程名称) -- > 姓名
                4. 传递函数依赖:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
                    例如:学号-->系名,系名-->系主任
                5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
                    例如:该表中码为:(学号,课程名称)
                    * 主属性:码属性组中的所有属性
                    * 非主属性:除过码属性组的属性
                    
        3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

第一范式

第二范式

 第三范式

数据库的备份和还原

1. 命令行:
    * 语法:
        * 备份: mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
        * 还原:
            1. 登录数据库
            2. 创建数据库
            3. 使用数据库
            4. 执行文件。source 文件路径

	mysqldump -uroot -p db > e://a.sql
	drop database db;
	create database db;
	source e://a.sql

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

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

相关文章

3.0里程碑:Topomel Box 现已在微软商店可用

猿友好! 今天是个大喜的日子 我的程序 Topomel Box 的第三个版本(3.0)正式上架微软商店。通过微软商店这个统一的分发渠道,Topomel Box 有望与更多国家的用户见面并提供服务。 安装方法很简单,只需要打开微软商店(Microsoft Sto…

⚡️【数据结构】二叉树的概念和相关知识总结

🌲目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1概念 2.2满二叉树 2.3完全二叉树 2.4满二叉树和完全二叉树的区别 2.5二叉树的性质 2.6…

linux日志管理总结,rules详解、轮转详解、实例展示。

概述 ​ 1、日志文件记录系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等 ​ 2、通过日志来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。 1. rsyslog系统日志管理 1.1 处理日志的程序&#…

工控安全-Modbus重放攻击

文章目录Modbus-重放攻击Modbus-仿真环境(ModSim)Modbus-协议采集(ModbusScan)抓取Modbus/TCP流量使用青云工具进行重放攻击Modbus-重放攻击 Modbus-仿真环境(ModSim) 首先开启Modbus仿真环境 ip地址是10.10.100.11 ModSim32,这个软件是模拟Modbus协议的一个仿真…

git push错误->Error: src refspec master does not match any

参考文章问题描述:在执行命令 git push origin master 时报错->Error: src refspec master does not match any问题分析:在网上查找解决方法,大部分人说是暂存区没有文件,未执行git add 导致出错。但是此时已经执行了git add 操…

将石油和天然气推向边缘

无论是来自在线购物交易还是工业环境中的物联网(IoT)设备,数据都是不断收集的。幸运的是,世界各地的每一个行业都可以利用这一趋势,许多行业都已经这样做了。在石油和天然气行业,持续的数据通信是现在保持完…

JavaScript刷LeetCode-字符串类解题技巧

序章 我们把字符串、数组、正则、排序、递归归为简单算法。接下来系列里,将系列文章里将为大家逐一介绍。 字符串 翻转字符串中的单词 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例 1: 输…

数据库和SQL介绍

数据库管理系统(数据库软件)那么如何实现这种数据库形式的数据管理呢?我们需要借助:数据库管理系统,也就是常说的数据库软件。数据库软件是非常多的,常见的有:这些软件都能实现︰管理库﹑管理表、基于表来管理数据数据库和SQL的关系数据库是…

Java 诊断利器 Arthas 快速入门

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信…

ORB-SLAM2 --- LocalMapping::KeyFrameCulling函数

目录 1.函数作用 2.code 3.函数解析 1.函数作用 检测当前关键帧在共视图中的关键帧,根据地图点在共视图中的冗余程度剔除该共视关键帧。 冗余关键帧的判定:90%以上的地图点能被其他关键帧(至少3个)观测到。 2.code /*** brie…

第七次作业部分

文章目录1、获取根分区剩余大小2、获取当前机器ip地址3、统计出apache的access.log中访问量最多的5个IP4、打印/etc/passwd中UID大于500的用户名和uid5、/etc/passwd 中匹配包含root或net或ucp的任意行6、处理以下文件内容,将域名取出并根据域名进行计数排序处理(百度搜狐面试题…

透过现象看本质,我找到了Netty粘包与半包的这几种解决方案。

1、粘包与半包 啥也不说了,直接上代码是不是有点不太友好,我所谓了,都快过年了,还要啥自行车 我上来就是一段代码猛如虎 1.1 服务器代码 public class StudyServer {static final Logger log LoggerFactory.getLogger(StudyS…

ORB-SLAM2 --- ORBmatcher::Fuse函数 --- 局部建图线程调用重载版

目录 1.函数作用 2.code 3.函数解析 1.函数作用 将参数一的关键帧的地图点与参数二的地图点集合进行融合。 将地图点投影到关键帧中进行匹配和融合;融合策略如下: 1.如果地图点能匹配关键帧的特征点,并且该点有对应的地图点&…

六、k8s Pod控制器详解

1 Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建控制器创建的pod&#x…

异常处理部分

文章目录一、异常概述及体系结构分类ErrorException异常的体系结构异常处理:抓抛模型异常处理机制一:try-catch-finallyfinally的使用异常处理机制一:throws异常类型如何选择两种方式手动生成异常对象如何定义自定义的异常类一、异常概述及体…

JVM学习- - -虚拟机栈详解

前言:今天学长带领大家走进JVM学习,让我们一起来学习认识虚拟机栈吧~ 目录 1 虚拟机栈概述 虚拟机栈出现的背景 初步印象 内存中的栈和堆 虚拟机栈基本内容 栈的优点 2 栈的存储单位 栈中存储什么? 栈运行原理 栈帧的内部结构 3 局…

【云原生】k8s之存储卷

内容预知 前言 1.emptyDir存储卷 2.hostPath存储卷 3.nfs共享存储卷 4. PVC 和 PV的静态存储卷 4.1 pv和pvc的介绍 4.2 pvc 和pv的创建过程及销毁过程 4.3 对pv的操作指导 4.4 静态创建pv和pvc资源由pod运用过程 步骤一:在NFS主机上创建共享目录,…

采用rknn-toolkit导出rknn模型并部署在rock3a-rk3568芯片 上全流程

因工作需要,需要将目标检测模型 部署在开发板上。在走了很多弯路后 找到一个成功的案例并记载下来 这里说一下我现有的硬件设备 。 我是购买的RADXA的rock3a开发板 搭载的soc是rk3568 这是开发板的正面图,因为瑞芯微针对计算机视觉中的目标检测模型有一…

Java IO流 - 缓冲流的详细使用介绍

文章目录缓冲流缓冲流概述字节缓冲流字符缓存流缓冲流 缓冲流概述 缓冲流介绍: 缓冲流也称为高效流、或者高级流。之前学习的字节流和字符流可以称为原始流。 作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能 缓冲流分为: 字节缓存输入流、字节…

做个测试工具

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…