by konley
复习笔记第二弹:四种约束、数据库设计、备份以及恢复
约束是对表中的数据进行限定,保证数据的正确性、有效性和完整性,作用对象是字段
分类:
主键约束:primary key
非空约束:not null
唯一约束:unique
外键约束:foreign key
not null
,字段下的值不能为null
创建表时添加非空约束
create table stu{
id int,
name varchar(20) not null --name为非空
};
在已有表的基础上添加非空约束
alter table stu modify name varchar(20) not null;
删除字段的非空约束
alter table stu modify name varchar(20);
unique
,值不能重复
创建表时添加唯一约束
不能重复对null无效,即允许有重复的null
create table stu{
id int;
tel varchar(20) unique;
}
在已有表的基础上添加唯一约束
添加时要注意该字段不能有重复的数据,不然会添加失败
alter table stu modify tel varchar(20) unique;
删除字段的唯一约束
此处不是modify 而是 drop index
删除索引
alter table stu drop index tel;
主键 primary key
创建表时添加主键约束
create table stu(
id int primary key, --给id添加主键
name varchar(20)
);
已有表后添加主键约束
alter table stu modify id int primary key;
删除主键约束
alter table stu drop primary key;--因为一张表只有一个主键,所以不用写字段
联合主键
可以保证不会出现完全重复的记录,如3,3、A,A
PRIMARY KEY(字段1,字段2)
foregin key
让表产生关系,从而保证数据的正确性
在创建表的时候添加外键约束
create table 表名(
...
--外键列
constraint 外键名 foregin key (本表字段) references 主表名(主表字段)
);
已有表后添加外键约束
alter table 表名 add constraint 外键名 foregin key (本表字段) references 主表名(主表字段)
省略外键名称的方式
此时系统会自动分配一个唯一的外键名
FOREIGN KEY (本表字段) REFERENCES 主表名(主表字段)
删除外键
alter table 表名 drop foregin key 外键名
可以在更新或者删除某一字段时,同步更新其他关联的字段,一般用在主外键之间
添加级联操作
alter table 表名 constraint 外键名 foregin key (本表字段) references 主表名(主表字段) on update cascaed on delete cascade;
级联操作分类
1.级联更新:on update cascade;
2.级联删除:on delete cascade;
auto_increment
一般用在主键上,可以设置某一字段自动增长,赋值的时候该字段为null即可
创建表时设置自动增长
create table stu(
id int primary key auto_increment,
name varchar(20)
);
已有表添加自动增长
alter table stu modify id int auto_increment;
删除自动增长
alter table stu modify id int;
一对一 ( 用的少 )
人和身份证 1-1
一个人只有一个身份证,一个身份证只能对应一个人
一对多 1-n
部门和员工
一个部门有多个员工,一个员工只能对应一个部门
多对多 n-m
学生和课程
一个学生可以选择多门课程,一门课程也可以被很多学生选择
关系 | 实现方法 |
---|---|
一对多 | 在n建立外键,指向1的主键 |
多对多 | 多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键,此时还需要联合主键确保没有重复数据 |
一对一 | 可以在任意一方添加唯一(unique)外键指向另一方的主键 |
创建一个旅游网站的分类、线路和用户收藏线路表
分析
-- 创建旅游线路分类表 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)
);
设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
常用的是第三范式
第一范式(1NF):每一列都是不可分割的原子数据项
第一范式是最基本的,不符合第一范式数据库表根本建不起来
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
例如:学号–>姓名。 (学号,课程名称) --> 分数
完全函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
例如:(学号,课程名称) --> 分数
部分函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
例如:(学号,课程名称) – > 姓名
传递函数依赖:A–>B, B – >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
例如:学号–>系名,系名–>系主任
码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
例如:该表中码为:(学号,课程名称)
* 主属性:码属性组中的所有属性
* 非主属性:除过码属性组的属性
普通表:
1NF表
2NF表
3NF表
语法
mysqldump -u用户名 -p密码 数据库名称 > [保存的路径].sql
示范
将数据库db1备份到d盘,命名为d.sql
mysqldump -uroot -p123456 db1 > d://a.sql
方法
source [文件路径].sql
示范
恢复数据库db1
mysql -uroot -p123456;
create database db1;
use db1;
source d://a.sql
可以直接使用Navicat或者sqlyog等工具直接对数据库进行导出导入,略