|NO.Z.00043|——————————|BigDataEnd|——|Java&MySQL多表/外键/数据库设计.V01|——|MySQL.v01|多表概述|

一、多表
### --- 多表简述

——>        实际开发中,一个项目通常需要很多张表才能完成。
——>        例如一个商城项目的数据库,需要有很多张表:用户表、分类表、商品表、订单表....
### --- 单表的缺点

~~~     # 数据准备
——>        创建一个数据库 db3
CREATE DATABASE db3 CHARACTER SET utf8;
### --- 数据库中 创建一个员工表 emp ,

——>        包含如下列 eid, ename, age, dep_name, dep_location
——>        eid 为主键并 自动增长, 添加 5 条数据
-- 创建emp表 主键自增

CREATE TABLE emp(
    eid INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(20),
    age INT ,
    dep_name VARCHAR(20),
    dep_location VARCHAR(20)
);
-- 添加数据

INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('张百万', 20, '研发部', '广州');
INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('赵四', 21, '研发部', '广州');
INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('广坤', 20, '研发部', '广州');
INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('小斌', 20, '销售部', '深圳');
INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('艳秋', 22, '销售部', '深圳');
INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('大玲子', 18, '销售部', '深圳');
### --- 单表的问题

——>        冗余, 同一个字段中出现大量的重复数据
二、解决方案
### --- 设计为两张表

多表方式设计
删除emp表, 重新创建两张表
——>        department 部门表 : id, dep_name, dep_location
——>        employee 员工表: eid, ename, age, dep_id
-- 创建部门表
-- 一方,主表
CREATE TABLE department(
    id INT PRIMARY KEY AUTO_INCREMENT,
    dep_name VARCHAR(30),
    dep_location VARCHAR(30)
);
-- 创建员工表
-- 多方 ,从表
CREATE TABLE employee(
    eid INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(20),
    age INT,
    dept_id INT
);
### --- 添加部门表数据

-- 添加2个部门
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳');
SELECT * FROM department;
### --- 添加员工表 数据

-- 添加员工,dep_id表示员工所在的部门
INSERT INTO employee (ename, age, dept_id) VALUES ('张百万', 20, 1);
INSERT INTO employee (ename, age, dept_id) VALUES ('赵四', 21, 1);
INSERT INTO employee (ename, age, dept_id) VALUES ('广坤', 20, 1);
INSERT INTO employee (ename, age, dept_id) VALUES ('小斌', 20, 2);
INSERT INTO employee (ename, age, dept_id) VALUES ('艳秋', 22, 2);
INSERT INTO employee (ename, age, dept_id) VALUES ('大玲子', 18, 2);

SELECT * FROM employee;
三、表关系分析
### --- 部门表与员工表的关系

——>        员工表中有一个字段dept_id 与部门表中的主键对应,员工表的这个字段就叫做 外键
——>        拥有外键的员工表 被称为从表, 与外键对应的主键所在的表叫做主表
### --- 多表设计上的问题
~~~     当我们在 员工表的 dept_id 里面输入不存在的部门id ,数据依然可以添加 显然这是不合理的.

-- 插入一条 不存在部门的数据
INSERT INTO employee (ename,age,dept_id) VALUES('无名',35,3);
——>        实际上我们应该保证,员工表所添加的 dept_id , 必须在部门表中存在.
### --- 解决方案:

——>        使用外键约束,约束 dept_id ,必须是 部门表中存在的id
——>        多表关系中的主表和从表
——>        主表: 主键id所在的表, 约束别人的表
——>        从表: 外键所在的表多, 被约束的表
四、sql语句
### --- sql语句
-- 创建部门表
-- 一方,主表

CREATE TABLE department(
     id INT PRIMARY KEY AUTO_INCREMENT,   
     dep_name VARCHAR(30),  
     dep_location VARCHAR(30)
);
-- 创建员工表
-- 多方 ,从表
CREATE TABLE employee(
    eid INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(20),
    age INT,
    dept_id INT
);
-- 添加2个部门 
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳'); 
SELECT * FROM department; 
-- 添加员工,dep_id表示员工所在的部门 
INSERT INTO employee (ename, age, dept_id) VALUES ('张百万', 20, 1); 
INSERT INTO employee (ename, age, dept_id) VALUES ('赵四', 21, 1); 
INSERT INTO employee (ename, age, dept_id) VALUES ('广坤', 20, 1); 
INSERT INTO employee (ename, age, dept_id) VALUES ('小斌', 20, 2); 
INSERT INTO employee (ename, age, dept_id) VALUES ('艳秋', 22, 2); 
INSERT INTO employee (ename, age, dept_id) VALUES ('大玲子', 18, 2); 

SELECT * FROM employee;
-- 插入一条 不存在部门的数据
INSERT INTO employee (ename,age,dept_id) VALUES('无名',35,3);

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

 

posted on 2022-04-05 13:36  yanqi_vip  阅读(27)  评论(0)    收藏  举报

导航