MySQL:多表概述
阿新 • • 發佈:2021-07-15
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( eidINT 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