1. 程式人生 > 其它 >MySQL:多表概述

MySQL:多表概述

1.  多表簡述

      實際開發中,一個專案通常需要很多張表才能完成。

      例如一個商城專案的資料庫,需要有很多張表:使用者表、分類表、商品表、訂單表....

2.  單表的缺點

資料準備

1) 建立一個數據庫 db3

CREATE DATABASE db3 CHARACTER SET utf8;

2) 資料庫中 建立一個員工表 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, '銷售部', '深圳');

3)單表的問題

   冗餘, 同一個欄位中出現大量的重複資料

  

3. 解決方案

設計為兩張表

<1> 多表方式設計

    department 部門表 : id, dep_name, dep_location

    employee 員工表: eid, ename, age, dep_id

<2>刪除emp表, 重新建立兩張表

-- 建立部門表 
-- 一方,主表 
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 
);

<3>新增部門表資料

-- 新增2個部門 
INSERT INTO department VALUES(NULL, '研發部','廣州'),(NULL, '銷售部', '深圳'); 
SELECT * FROM department;

<4>新增員工表資料

-- 新增員工,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;

<5> 表關係分析   

部門表與員工表的關係

  1) 員工表中有一個欄位dept_id 與部門表中的主鍵對應,員工表的這個欄位就叫做 外來鍵  

   2) 擁有外來鍵的員工表 被稱為 從表 , 與外來鍵對應的主鍵所在的表叫做 主表

4. 目前的多表設計的問題    

    當我們在 員工表的 dept_id 裡面輸入不存在的部門id ,資料依然可以新增!

    顯然,這是不合理的.

-- 插入一條 不存在部門的資料 
INSERT INTO employee (ename,age,dept_id) VALUES('無名',35,3);
  • 實際上我們應該保證,員工表所新增的 dept_id , 必須在部門表中存在.

解決方案:

  •   使用外來鍵約束,約束 dept_id ,必須是 部門表中存在的id