【Mysql】多表、外鍵約束

多表

1.1 多表簡述
實際開發中,一個項目通常需要很多張表才能完成。
例如一個商城項目的數據庫,需要有很多張表:用戶表、分類表、商品表、訂單表…
1.2 單表的缺點
1.2.1 數據準備

  1. 創建一個數據庫 db3
CREATE DATABASE db3 CHARACTER SET utf8;
  1. 數據庫中 創建一個員工表 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, '銷售部', '深圳'); 

1.2.2 單表的問題
?冗余, 同一個字段中出現大量的重復數據
在這里插入圖片描述

1.3 解決方案
1.3.1設計為兩張表
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; 
  1. 添加員工表 數據
-- 添加員工,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;

1.3.2 表關系分析
部門表與員工表的關系
1.員工表中有一個字段dept_id 與部門表中的主鍵對應,員工表的這個字段就叫做 外鍵。
2.擁有外鍵的員工表 被稱為從表, 與外鍵對應的主鍵所在的表叫做主表。
在這里插入圖片描述

1.3.3 多表設計上的問題
當我們在 員工表的 dept_id 里面輸入不存在的部門id ,數據依然可以添加 顯然這是
不合理的。

-- 插入一條 不存在部門的數據
INSERT INTO employee (ename,age,dept_id) VALUES('無名',35,3);

在這里插入圖片描述

實際上我們應該保證,員工表所添加的 dept_id , 必須在部門表中存在.
解決方案:
?使用外鍵約束,約束 dept_id ,必須是 部門表中存在的id
1.4 外鍵約束
1.4.1 什么是外鍵
?外鍵指的是在 從表中 與主表的主鍵對應的那個字段,比如員工表的 dept_id,就是外鍵。
?使用外鍵約束可以讓兩張表之間產生一個對應關系,從而保證主從表的引用的完整性。

在這里插入圖片描述

多表關系中的主表和從表
?主表: 主鍵id所在的表, 約束別人的表。
?從表: 外鍵所在的表多, 被約束的表。
在這里插入圖片描述

1.4.2 創建外鍵約束
語法格式:
1)新建表時添加外鍵

[CONSTRAINT] [外鍵約束名稱] FOREIGN KEY(外鍵字段名) REFERENCES 主表名(主鍵字段名) 

2)已有表添加外鍵

ALTER TABLE 從表 ADD [CONSTRAINT] [外鍵約束名稱] FOREIGN KEY (外鍵字段名) REFERENCES 主表(主 鍵字段名);
  1. 重新創建employee表, 添加外鍵約束
-- 先刪除 employee表
DROP TABLE employee;-- 重新創建 employee表,添加外鍵約束
CREATE TABLE employee(eid INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(20),age INT,dept_id INT,-- 添加外鍵約束CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES department(id)
);
  1. 插入數據
-- 正常添加數據 (從表外鍵 對應主表主鍵)
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); -- 插入一條有問題的數據 (部門id不存在)
-- Cannot add or update a child row: a foreign key constraint fails 
INSERT INTO employee (ename, age, dept_id) VALUES ('錯誤', 18, 3); 

4)添加外鍵約束,就會產生強制性的外鍵數據檢查, 從而保證了數據的完整性和一致性
在這里插入圖片描述

1.4.3 刪除外鍵約束
語法格式

alter table 從表 drop foreign key 外鍵約束名稱

刪除 外鍵約束

-- 刪除employee 表中的外鍵約束,外鍵約束名 emp_dept_fk
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;

再將外鍵 添加回來, 語法格式

ALTER TABLE 從表 ADD [CONSTRAINT] [外鍵約束名稱] FOREIGN KEY (外鍵字段名) REFERENCES 主表(主 鍵字段名);

SQL示例

-- 可以省略外鍵名稱, 系統會自動生成一個
ALTER TABLE employee ADD FOREIGN KEY (dept_id) REFERENCES department (id);

1.4.4外鍵約束的注意事項
1)從表外鍵類型必須與主表主鍵類型一致 否則創建失敗.
在這里插入圖片描述

  1. 添加數據時, 應該先添加主表中的數據.
-- 添加一個新的部門
INSERT INTO department(dep_name,dep_location) VALUES('市場部','北京');-- 添加一個屬于市場部的員工
INSERT INTO employee(ename,age,dept_id) VALUES('老胡',24,3);
  1. 刪除數據時,應該先刪除從表中的數據.
-- 刪除數據時 應該先刪除從表中的數據
-- 報錯 Cannot delete or update a parent row: a foreign key constraint fails
-- 報錯原因 不能刪除主表的這條數據,因為在從表中有對這條數據的引用
DELETE FROM department WHERE id = 3;
-- 先刪除從表的關聯數據
DELETE FROM employee WHERE dept_id = 3;-- 再刪除主表的數據
DELETE FROM department WHERE id = 3;

1.5物理外鍵和邏輯外鍵
?物理外鍵
物理外鍵實際通過數據庫語法設置為外鍵.
?邏輯外鍵
邏輯外鍵是指,字段設置時不需要額外通過數據庫語法設置成外鍵關聯.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35730.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35730.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35730.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Segment any Text:優質文本分割是高質量RAG的必由之路

AI應用開發相關目錄 本專欄包括AI應用開發相關內容分享,包括不限于AI算法部署實施細節、AI應用后端分析服務相關概念及開發技巧、AI應用后端應用服務相關概念及開發技巧、AI應用前端實現路徑及開發技巧 適用于具備一定算法及Python使用基礎的人群 AI應用開發流程概…

基于qemu_v8 + optee400構建自定義app

構建基于libckteec的tls安全通信應用程序,應用目錄結構 $ tree -L 2 . ├── libp11 │ ├── libp11-libp11-0.4.12 │ ├── mk_optee_three_part.sh │ └── out ├── openssl │ ├── mk_optee_three_part.sh │ ├── openssl-1.1.1w │ …

vue項目中封裝element分頁組件

我們都知道封裝組件是為了方便在項目中使用,全局封裝之后哪個模塊使用直接復制就行了,分頁在后臺項目中用到的地方也是很多的,所以我們就全局封裝一下分頁組件,以后也方便在項目中使用,接下來封裝的這個分頁也是elemen…

clean code-代碼整潔之道 閱讀筆記(第十四章)

第十四章 逐步改進——對一個命令行參數解析程序的案例研究 ps:本章設計代碼示例所以篇幅會較長,推薦直接看原文,思路、代碼講解的很清楚 本章示例:解析命令行參數的工具 —— Args Args的簡單用法 public static void main(Stri…

vue中動態綁定樣式名的方式有幾種?

在Vue中可以使用動態綁定樣式名的方式有幾種,具體取決于你的需求和使用的場景。 使用對象語法: 可以通過在data中定義一個變量,然后在模板中使用對象語法來動態綁定樣式名。 <template><div :class="{ active: isActive }">Hello Vue!</div> &l…

網絡文化經營許可證(文網文)辦理全面講解

隨著互聯網時代的飛速發展&#xff0c;互聯網早已滲透到人們的生活中&#xff0c;各類直播、短視頻成為大家生活娛樂必不可少的一部分。注冊一家從事互聯網行業的企業是一個不錯的選擇。那互聯網企業需要辦理什么證件資質呢&#xff1f;在互聯網行業從事盈利文化活動必須持有網…

【精品方案】智能制造之路(93頁PPT)

引言&#xff1a;智能制造之路&#xff1a;革新制造業的引領之旅 隨著科技的迅猛發展&#xff0c;特別是人工智能、物聯網、大數據等技術的不斷進步&#xff0c;制造業正迎來一場深刻的變革。智能制造&#xff0c;作為這場變革的核心&#xff0c;正逐步成為推動產業升級和轉型發…

MySQL為什么不建議使用多表JOIN

一、典型回答 之所以不建議使用JOIN查詢&#xff0c;最主要的原因就是JOIN的效率比較低。 MySQL是使用了嵌套循環&#xff08;Nested-Loop Join&#xff09;的方式實現關聯查詢的&#xff0c;簡單點說就是要通過兩層循環&#xff0c;用第一張表做外循環&#xff0c;第二張表做內…

大模型課程資料-全網最火29套全棧大模型項目實踐

29套AI全棧大模型項目實戰&#xff0c;人工智能視頻課程-多模態大模型&#xff0c;微調技術訓練營&#xff0c;大模型多場景實戰&#xff0c;AI圖像處理&#xff0c;AI量化投資&#xff0c;OPenCV視覺處理&#xff0c;機器學習&#xff0c;Pytorch深度學習&#xff0c;推薦系統…

【LLM】一分鐘帶你了解Agent工作流四范式

文章目錄 1. 大模型直接生成-generation2. 大模型充當工具使用-tool3. 大模型執行思維鏈-Planning4. 多大模型Agent合作-multiagent collaboration 1. 大模型直接生成-generation 通過提示詞&#xff0c;大模型直接生成想要的結果&#xff1a; 2. 大模型充當工具使用-tool …

無人機在農業方面應用的局限性

無人機在農業方面的應用雖然帶來了許多便利和效率提升&#xff0c;但也存在一些局限性。以下是對這些局限性的清晰歸納和分點表示&#xff1a; 飛行受限&#xff1a; 無人機在飛行過程中受到一定限制&#xff0c;例如在森林、城市等復雜地形或建筑物密集區域&#xff0c;其空間…

擁抱數字化未來,如何以費控驅動業務發展?

管理費用是企業運營中僅次于人力成本的第二大可控成本&#xff0c;一般會占到企業年度收入的5%—10%&#xff0c;但多數企業存在費用疏于管理、費用管理制度流于紙面難落地、費用浪費嚴重等問題。 如果不進行科學管理&#xff0c;有專家表示&#xff0c;估計企業每年至少有10%的…

vue總結

1.什么是VUE? Vue就是一套用于構建用戶界面的漸進式框架,與其他框架不同的是,Vue被設計為可以自底向上逐漸應用.Vue的核心庫只關注圖層,不僅容易上手,還便于與第三方庫或既有項目整合. 2.Vue的優點 體積小 高效率 雙向數據綁定,簡化Dom操作 通過MVVM思想實現數據的雙向綁定…

Pixea Plus for Mac:圖像編輯的極致體驗

Pixea Plus for Mac 是一款專為 Mac 用戶設計的強大圖像編輯軟件。憑借其卓越的性能和豐富的功能&#xff0c;它為用戶帶來了前所未有的圖像編輯體驗。無論是專業的設計師&#xff0c;還是業余的攝影愛好者&#xff0c;Pixea Plus 都能滿足您對于圖像編輯的各種需求。 Pixea P…

瀏覽器擴展V3開發系列之 chrome.cookies 的用法和案例

【作者主頁】&#xff1a;小魚神1024 【擅長領域】&#xff1a;JS逆向、小程序逆向、AST還原、驗證碼突防、Python開發、瀏覽器插件開發、React前端開發、NestJS后端開發等等 chrome.cookies API能夠讓我們在擴展程序中去操作瀏覽器的cookies。 在使用 chrome.cookies 要先聲明…

軟考系統架構師考試考點整理就看這一篇

軟考系統架構師考試考點整理就看這一篇 最近軟考成績出來了不少同學與筆者溝通&#xff0c;聊到軟考現在越來越難了&#xff0c;考了兩三次都沒過&#xff0c;也有不少新同學咨詢軟考考試的一些福利政策&#xff0c;投入大量的物力&#xff0c;財力&#xff0c;精力&#xff0c…

如何借助物聯網實現土壤監測與保護

如何借助物聯網實現土壤監測與保護 高標準農田信息化是指利用現代信息技術&#xff0c;如物聯網、大數據、云計算等&#xff0c;對農田進行數字化、智能化的管理&#xff0c;以提高農田的生產效率和可持續發展能力。其中&#xff0c;土壤監測與保護是農田信息化的重要內容之一…

Vue3中根據select得選項值,改變當前元素同級下的子元素得disabled屬性值

在 Vue 3 中,你通常不會直接通過類名(或任何其他 DOM 選擇器)來獲取 DOM 元素,因為 Vue 鼓勵你使用數據驅動視圖的方式來更新和操作元素。然而,如果你確實需要訪問 DOM 元素(這通常是不推薦的,除非有特別的原因),你可以使用 Vue 3 的 ref 或者 refs(在模板中使用 ref…

Python 入門 —— 面向對象編程

Python 入門 —— 面向對象編程 面向對象編程是一種編程范式&#xff0c;通過將對象作為程序的基本單元&#xff0c;每個對象之間可以相互傳遞信息&#xff0c;并通過各自的方法對信息進行處理&#xff0c;從而達到程序處理的目的。 而面向過程編程則是將程序視為一系列順序執…

低代碼:釋放企業創新力的鑰匙

近年來&#xff0c;隨著信息技術的不斷發展&#xff0c;企業對于快速開發應用程序的需求越來越迫切。然而&#xff0c;傳統的軟件開發過程常常耗時費力&#xff0c;限制了企業的創新潛力。于是&#xff0c;低代碼應運而生&#xff0c;成為解決開發難題的一把利器。 低代碼開發…