JavaWeb(8)MySQL约束、数据库的设计

  • Post author:
  • Post category:java

1. MySQL约束

1. 概念:对表中的数据进行绑定,保证数据的正确性、有效性、完整性

2. 分类:
(1)主键约束:primary key
(2)非空约束:not null
(3)唯一约束:unique
(4)外键约束:foreign key

3. 非空约束: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);

4. 唯一约束:unique,某一列的值不能重复
(1)在创建表时添加唯一约束

create table stu(
	id int,
	phone_number varchar(20) unique  -- 手机号唯一
)

【注意】在MySQL中,唯一约束限定的列的值可以有多个null

(2)删除唯一约束

alter table stu drop index phone_number;

(3)在创建完表后添加唯一约束

alter table stu modify phone_number varchar(20) unique;

5. 主键约束:primary key,非空且唯一

(1)注意:

1. 含义:非空且唯一
2. 一张表只能有一个字段为主键
3. 主键就是表中记录的唯一标识

(2)在创建表时添加主键

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

(3)删除主键

alter table stu drop primary key;
alter table stu modify id int;   -- 错误!!

(4)在创建完表后,添加主键

alter table stu modify id int primary key;

(5)自动增长

1. 概念:如果某一列是数值类型的,可以使用auto_increment来完成值的自动增长
2. 在创建表时,添加主键约束,并完成自动增长
	create table stu(
		id int primary key auto_increment,
		name varchar(20)
	)
3. 删除自动增长
	alter table stu modify id int;
4. 添加自动增长
	alter table stu modify id int auto_increment;

6. 外键约束: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 

2. 数据库的设计

1. 多表之间的关系
(1)分类

1. 一对一(了解)
	如:人和身份证
	分析:一个人只有一个身份证,一个身份证也只对应一个人
2. 一对多(多对一)
	如:部门和员工
	分析:一个部门有多个员工,一个员工对应一个员工
3. 多对多
	如:学生和课程
	分析:一个学生可以选择多门课程,一个课程也可以被多个学生选

(2)实现关系

4. 一对多(多对一)
	如:部门和员工
	实现方式:再多的一方简历外键,指向1的一方的主键
5. 多对多
	如:学生和课程
	实现方式:多对多的实现需要借助第三张表,中间表至少包含两个字段,这两个字段作为第三张表的外键, 分别指向两个表的主键
6. 一对一
	如:人和身份证
	实现方式:一对一关系的实现,可以在任意一方添加唯一外键指向另一方的主键

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(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. 范式
(1)概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前面的范式的要求
(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基础上消除传递依赖)

版权声明:本文为nswzr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。