表与表的关系
一对一
例如,现在有两个表,每个人是一张表,每个身份证是一张表,每个人只有一张身份证,必须先有人,才会有身份证
而一对一的表之中,要分清楚谁是主表,谁是从表,由以上分析可知,人是主表,身份证是从表
下面用一个具体的案例来更好的理解这种关系
首先,建立两个表,一个表为qq表,一个表为qqDetial表
CREATE TABLE tb_qq(
qqid INT PRIMARY KEY,
PASSWORD VARCHAR(50)
);
CREATE TABLE tb_qqDetial(
qqid INT PRIMARY KEY,
NAME VARCHAR(50),
address VARCHAR(500)
);
然后,为qqDetial的主键qqid添加一个外键约束
ALTER TABLE tb_qqDetial ADD CONSTRAINT fk_tb_qq_tb_qqDetial
FOREIGN KEY (qqid) REFERENCES tb_qq(qqid);
之后,你可以通过MySQL数据库管理软件,看到表与表之间的关系
这种一对一的关系实现的方法靠的是主外键的约束,每个表都有主键,而从表的主键还有一个外键约束,这样就实现了一对一
一对多
一对多和多对一,只是看问题的角度不同
例如学生表和成绩表,从学生角度看,一个学生有多个成绩,是一对多
从成绩表来看,多个成绩对应一个学生,则是多对一
下面用代码来实现
建立两个表,在建立表的时候,就为表添加了外键约束
CREATE TABLE tb_student(
id INT PRIMARY KEY,
NAME VARCHAR(50),
sex VARCHAR(10)
);
CREATE TABLE tb_score(
stuid INT,
score INT,
courseid INT,
CONSTRAINT fk_tb_student_tb_score FOREIGN KEY (stuid)
REFERENCES tb_student(id)
);
这样通过MySQL数据库管理工具就可以看到表与表的关系
多对多的关系
用一个案例来理解,一个老师可以教多个学生,一个学生也可以由多个老师来交
所有老师与学生之间的关系是多对多的关系,而为了更好的实现多对多的关系,要借助第三张表,来保存这种关系
下面是代码实现
CREATE TABLE tb_teacher(
tid INT PRIMARY KEY,
NAME VARCHAR(50)
);
CREATE TABLE tb_stu(
sid INT PRIMARY KEY,
NAME VARCHAR(50)
);
CREATE TABLE tb_tea_stu_rel(
tid INT,
sid INT
);
之后为第三张表添加外键约束
ALTER TABLE tb_tea_stu_rel ADD CONSTRAINT fk_tb_tea
FOREIGN KEY(tid) REFERENCES tb_teacher(tid);
ALTER TABLE tb_tea_stu_rel ADD CONSTRAINT fk_tb_stu
FOREIGN KEY(sid) REFERENCES tb_stu(sid);
这样通过MySQL数据库管理工具就可以看到表与表的关系
总结
在上面的案例中,每个案例都可以放到一张表中去存储数据,那么为什么要放在多张表中呢?
原因如下:
1:可以减少数据的冗余,即减少相同的数据的重复性
2:如果信息都存在一张表中,维护时很不方便,如学生拥有多个成绩,每个成绩都是一行,而当要修改学生的信息时,就要逐行修改,数据量如果很大的话,非常不易维护
3:对表进行查询的时候,连接查询的速度比整表扫描查询的速度要快
生产SQL脚本,导出数据
在控制台时执行mysqldump 命令可以用来生产指定数据库的脚本文件,
生成的脚本文件中,包含表的结构(create),数据(insert),
数据库不能保存,在恢复的时候需要自己创建一个数据库。
语法
mysqldump -u用户名 -p密码 数据库名 > 生产的脚本文件路径\文件名.sql
注意:执行mysqldump命令,直接在Windows控制台下面执行,无需登录mysql,-u与-p后不要加空格,会出错
执行SQL脚本,恢复数据
介绍
前提:必须先创建数据库
执行SQL脚本需要登录mysql,然后指定数据库,最后执行SQL脚本即可。
语法
source SQL脚本文件