1.1 备份的应用场景:
- 在实际开发中,假如某天我们的数据库的数据被人误删了,那么数据就完全丢失了,所以我们一般需要对数据库的数据进行备份的。
1.2 source命令备份与还原:
- 如果需要备份数据库的数据,我们需要使用到mysql给我们提供的工具:mysqldump.
- 备份格式(在非登录的情况下进行备份):mysqldump -u用户名 -p密码 数据库>文件的路径
- 注意:数据库备份是没有创建数据库的语句的,只有创建表与插入数据的语句。
- 还原格式:(登录情况下去使用的,而且必须要选择指定的数据库):source 导入文件的路径;
1.3 图形化界面备份与还原:(实际开发过程中推荐使用)
2.数据库的约束
2.1 约束的作用:
- 约束的作用就是限制表中的数据。
2.2 约束的分类:
- PRIMARY KEY:主键
- UNIQUE:唯一
- NOT NULL:非空
- DEFAULT:默认
- FOREIGN KEY:外键
2.3 主键约束
2.3.1 主键约束的作用:
- 主键的作用:在实际开发中其实数据库表中的每一条记录都应用具备唯一的标识符,主键的作用就是标记每一条数据的唯一性。主键不具备任何的业务含义。
- 每个表都应该有一个主键,并且每个表只能有一个主键。有些记录的name,age,score字段的值都一样时,那么就没法区分这些数据,造成数据库的记录不唯一,这样不方便管理数据。
- 哪个字段应该作为表的主键?通常不用业务字段作为主键,比如单独给每张表设计一个id的字段,把id作为主键。主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。
2.3.2 主键的特点:
- 唯一。
- 非空。
- 被引用。
2.3.3 创建主键代码演示:
# 1.在创建表的时候给字段添加主键 字段名 字段类型 PRIMARY KEY
CREATE TABLE emp(
id INT PRIMARY KEY,
NAME VARCHAR(10),
sex CHAR(2)
);
2.在已有表中添加主键:ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
#2.在已有表中添加主键 ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
ALTER TABLE student ADD PRIMARY KEY(id);
3.删除主键:
#3.删除主键 ALTER TABLE 表名 DROP PRIMARY KEy;
ALTER TABLE student DROP PRIMARY KEY;
2.3.4 主键自增:
- 主键如果让我们自己添加很有可能重复,我们通常希望在每次插入新记录时,数据库自动生成主键字段的值AUTO_INCREMENT表示自动增长(字段类型必须是整数类型)
- 主键的作用其实是仅仅代表了该数据的唯一性,因为主键没有任何的业务含义。在实际开发中很多时候我们都可以让主键列自增即可。1,2,3,4...
1.在创建表的时候设置主键,并且让表的主键自增 (AUTO_INCREMENT)
#在创建表的时候设置主键,并且让表的主键自增(AUTO_INCREMENT)
CREATE TABLE emp1(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
sex CHAR(2)
);
- 默认地AUTO_INCREMENT的开始值是1,如果希望修改起始值,请使用下列SQL语法:ALTER TABLE 表名 AUTO_INCREMENT =起始值;
2. 后期给主键列添加自增(自增也属于一种类型)
#后期给主键列添加自增
ALTER TABLE emp MODIFY id INT AUTO_INCREMENT;
3. 后期取消主键的自增
#后期取消主键的自增
ALTER TABLE emp MODIFY id INT;
- 删除记录的时候是不会影响到主键自增的顺序的。
- 如果是使用truncate摧毁表,那么自增才会又从0开始。
2.4 唯一约束
2.4.1 唯一约束的格式:
- 格式:字段名 字段类型 UNIQUE
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10) UNIQUE,
sex CHAR(2)
);
INSERT INTO emp VALUES(1,'马云','男');
INSERT INTO emp VALUES(2,'马化腾','男');
INSERT INTO emp VALUES(3,'雷军','男');
INSERT INTO emp VALUES(4,'李彦宏','男');
DESC emp;
#插入相同的名字出现name重复:Duplicate entry '马云' for key 'name'
INSERT INTO emp VALUES(5,'马云','男');
#出现多个null值时候会怎样?因为null没有值,所以不存在重复的问题
INSERT INTO emp VALUES(6,NULL,NULL);
INSERT INTO emp VALUES(7,NULL,NULL);
2.5 非空约束
这个字段必须设置值,不能是null。
2.5.1 非空约束格式:
- 字段名 字段类型 NOT NULL
#创建员工表,并且name实现非空 not null 非空 default
CREATE TABLE emp1(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10) NOT NULL DEFAULT '马云',
sex CHAR(2)
);
2.6默认值:
- 往表中添加数据时,如果不指定这个字段的数据,就使用默认值。
- 默认值的格式:字段名 字段类型 default 默认值
#创建员工表,并且name实现非空 not null 非空 default
CREATE TABLE emp1(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10) NOT NULL DEFAULT '马云',
sex CHAR(2)
);
2.7 外键约束:(重点)
创建一个员工表包含如下列(id, name, age, dep_name, dep_location),id主键并自动增长,添加5条数据
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,'销售部','深圳');
- 缺点:表中出现了很多重复的数据(数据冗余),如果要修改研发部的地址需要修改3个地方。
- 解决方案:将一张表分成2张表(员工表和部门表)
#创建部门表
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dep_name VARCHAR(20),
dep_location VARCHAR(20)
);
#创建员工表
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT
);
#添加两个部门
INSERT INTO department (dep_name,dep_location) VALUES('研发部','广州'),('销售部','深圳');
#添加员工,dep_id表示员工所在的部门
INSERT INTO employee(NAME,age,dep_id)VALUES
('张三',20,1),
('李四',21,1),
('王五',20,1),
('老王',20,2),
('大王',22,2),
('小王',18,2);
问题:当我们在employee的dep_id里面输入不存在的部门,数据依然可以添加.但是并没有对应的部门,不能出现
这种情况。employee的dep_id中的内容只能是department表中存在的id。
目标:需要约束dep_id只能是department表中已经存在id 解决方式:使用外键约束
- 什么是外键约束:一张表中的某个字段引用另一个表的主键 主表:约束别人 副表/从表:使用别人的数据,被别人约束。
2.8 创建外键:
- 添加外键列的格式:constraint 外键的名称 foreign key(从表的外键列) references 主表(主键);
- 外键的名称是可以随意的名字,但是一般都是FK开头或者结尾。
1.创建表的时候添加外键列:
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT,
#外键的名称是可以随意取名字的,但是一般以FK开头或结尾
#constraint 外键的名称 foreign key(从表的外键列) references 主表(主键);
CONSTRANT dept_emp_FK FOREIGN KEY(dep_id) REFERENCES dept(id)
);
2.后期添加外键列:
#后期添加外键的关系
ALTER TABLE emp ADD CONSTRAINT dept_emp_FK FOREIGN KEY(dep_id) REFERENCES dept(id);
3.删除外键:
- 格式:alter table 表名 drop foreign key 外键的名称;
#删除外键
#格式:alter table 表名 drop foreign key 外键的名称;
ALTER TABLE emp DROP FOREIGN KEY dept_emp_FK;
2.9 外键的级联:
- 一旦外键的关系建立了,那么就出现了从表与主表之间的关系。从表的数据应用是需要参考主表的数据。如果希望主表的数据发送变化的时候,从表的数据也发送变化的话,那么我们就必须要建立外键的级联关系。
- 外键的级联关系:删除、更新。
- 格式:on delete|update cascade
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT,
#外键的级联格式:on delete|update cascade
CONSTRAINT dep_emp_Fk FOREIGN KEY(dep_id) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE
);
3.表关系:
- 在java中类与类之间是存在关系的,在数据库中表与表之间也是存在关系的。
3.1 一对多关系(最常见):
- 一对多(1:n) 例如:班级和学生,部门和员工,客户和订单,分类和商品 一对多建表原则: 在从表(多方)创建一个
字段,字段作为外键指向主表(一方)的主键。- 解决方案:在多的一方建立外键关系,引用主表的主键。
3.2 多对多关系(常见):
- 多对多(m:n) 例如:老师和学生,学生和课程,用户和角色 多对多关系建表原则: 需要创建第三张表,中间表中
至少两个字段,这两个字段分别作为外键指向各自一方的主键。- 多对多的解决方案:
- 创建一张中间表。
- 创建外键列。
- 并且把外键列设置为联合主键。
3.3 一对一关系:(了解)
- 建立外键的关系。
- 并且把外键列设置为唯一。