SQL 外鍵(Foreign Key)詳細講解

1. 什么是外鍵???
  • ??定義??:外鍵是數據庫表中的一列(或一組列),用于??建立兩個表之間的關聯關系??。外鍵的值必須匹配另一個表的主鍵(Primary Key)或唯一約束(Unique Constraint)的值。
  • ??作用??:
    • 確保數據的??引用完整性??(Referential Integrity),防止無效數據插入。
    • 維護表之間的邏輯關系(如“一對多”或“多對多”)。

??2. 外鍵的語法??

在創建表時定義外鍵:

CREATE TABLE 子表 (列1 數據類型,列2 數據類型,...FOREIGN KEY (外鍵列) REFERENCES 父表(主鍵列)[ON DELETE 約束行為] [ON UPDATE 約束行為]
);

在已有表中添加外鍵:

ALTER TABLE 子表
ADD CONSTRAINT 約束名稱
FOREIGN KEY (外鍵列) REFERENCES 父表(主鍵列)
[ON DELETE 約束行為] [ON UPDATE 約束行為];

??3. 外鍵的約束行為??

當父表的記錄被刪除或更新時,子表的外鍵如何處理?通過?ON DELETE?和?ON UPDATE?指定:

約束行為說明
??CASCADE??級聯操作。父表刪除/更新記錄時,子表關聯記錄也被刪除/更新。
??SET NULL??父表刪除/更新記錄時,子表的外鍵列設為 NULL(要求外鍵列允許 NULL)。
??NO ACTION??默認行為。阻止父表的刪除/更新操作,如果子表存在關聯記錄。
??RESTRICT??類似?NO ACTION,立即檢查約束。
??SET DEFAULT??父表刪除/更新記錄時,子表的外鍵設為默認值(需定義默認值)。

??4. 多列外鍵??

外鍵可以由多個列組成,需滿足:

  • 子表和父表的列數、順序、數據類型一致。
  • 父表的列必須有唯一約束(如主鍵或唯一索引)。

??示例??:

CREATE TABLE 訂單詳情 (訂單ID INT,產品ID INT,數量 INT,PRIMARY KEY (訂單ID, 產品ID),FOREIGN KEY (訂單ID) REFERENCES 訂單(訂單ID),FOREIGN KEY (產品ID) REFERENCES 產品(產品ID)
);

??5. 外鍵的限制與注意事項??
  1. ??父表必須有主鍵或唯一約束??。
  2. ??外鍵列的數據類型必須與父表主鍵一致??。
  3. ??引擎支持??:如 MySQL 的 InnoDB 支持外鍵,而 MyISAM 不支持。
  4. ??性能影響??:外鍵會增加數據操作的檢查開銷,但能提升數據一致性。
  5. ??循環依賴??:避免兩個表互相引用。

??6. 實際應用示例??

??場景??:學生表(students)和課程表(courses),通過選課表(enrollments)關聯。

-- 父表:學生表
CREATE TABLE students (student_id INT PRIMARY KEY,name VARCHAR(50)
);-- 父表:課程表
CREATE TABLE courses (course_id INT PRIMARY KEY,course_name VARCHAR(50)
);-- 子表:選課表(含外鍵)
CREATE TABLE enrollments (student_id INT,course_id INT,enrollment_date DATE,FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE,FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE RESTRICT
);

??插入數據??:

-- 插入學生和課程
INSERT INTO students VALUES (1, 'Alice');
INSERT INTO courses VALUES (101, 'Math');-- 合法插入:學生和課程存在
INSERT INTO enrollments VALUES (1, 101, '2023-10-01');-- 非法插入:學生不存在,觸發外鍵錯誤
INSERT INTO enrollments VALUES (999, 101, '2023-10-01'); -- 報錯!

??7. 常見問題??
  1. ??外鍵必須指向主鍵嗎???
    不,可以指向父表的唯一約束(Unique Constraint)。

  2. ??能否跨數據庫引用???
    通常不支持,外鍵需在同一數據庫內。

  3. ??外鍵是否允許 NULL???
    如果外鍵列允許 NULL,則插入 NULL 是合法的(表示無關聯)。

  4. ??如何查看外鍵約束???
    使用數據庫工具或查詢元數據(如 MySQL 的?SHOW CREATE TABLE)。


??8. 總結??
  • ??外鍵的核心作用??:維護數據的一致性和關聯性。
  • ??適用場景??:需要強數據完整性的系統(如電商、金融)。
  • ??慎用場景??:高并發寫入且對性能要求極高的系統(需權衡一致性與性能)。

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

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

相關文章

5G中的DU和CU的作用

在5G網絡架構中,CU(Centralized Unit,集中單元) 和 DU(Distributed Unit,分布單元) 是無線接入網(RAN)的重要組成部分,它們的分工和作用如下: 1.…

深度解析 n8n:強大的開源工作流自動化平臺

在數字化時代,企業和個人面臨著日益復雜的工作流程和多樣化的應用工具,如何高效整合這些資源、實現工作流的自動化成為提升效率的關鍵。n8n 作為一款開源的工作流自動化平臺,憑借其強大的功能、廣泛的應用集成能力和靈活的部署方式&#xff0…

ruby超高級語法

以下是 Ruby 中一些 極度硬核 的語法和底層特性,涉及元編程的深淵、虛擬機原理、語法黑魔法等,適用于追求極限的 Ruby 開發者: 高級語法一 一、語法核彈級操作 1. 動態修改繼承鏈 class A; def foo; "A"; end end class B; def …

flutter 獲取通話記錄和通訊錄

Dart SDK version is 3.7.01 dependencies:flutter:sdk: flutterpermission_handler: ^11.0.1 # 權限管理flutter_contacts: ^1.1.92call_log: ^5.0.5cupertino_icons: ^1.0.8dev_dependencies:flutter_test:sdk: flutterflutter_lints: ^5.0.0 2 contact_and_calls_page.da…

bash腳本手動清空mysql表數據

文章目錄 1、bash腳本手動清空mysql表數據 1、bash腳本手動清空mysql表數據 #!/bin/bash# 配置區域(修改此處) MYSQL_USER"root" MYSQL_PASSWORD"123456" MYSQL_HOST"localhost" DATABASES("hps-base:base_test_ite…

Spark Core編程

一文讀懂Spark Core編程核心要點 最近在學習大數據處理框架Spark,今天來給大家分享一下Spark Core編程中非常重要的內容,包括RDD算子、累加器和廣播變量,希望能幫助大家更好地理解和掌握Spark編程。先來說說RDD算子,它是Spark編程…

SDP(一)

SDP(Session Description Protocol)會話描述協議相關參數 Session Description Protocol Version (v): 0 --說明:SDP當前版本號 Owner/Creator, Session Id (o): - 20045 20045 IN IP4 192.168.0.0 --說明:發起者/創建者 會話ID,那么該I…

HarmonyOS:組件布局保存至相冊

一,需求背景 有這樣一個需求,將頁面上的某個自定義組件以圖片的形式保存至相冊。 二,需求拆解 根據需求分析,可將需求拆解成兩步: 1,將組件轉換成圖片資源; 2,將圖片保存到相冊…

算法中的數論基礎

算法中的數論基礎 本篇文章適用于算法考試或比賽之前的臨場復習記憶,沒有復雜公式推理,基本上是知識點以及函數模版,涵蓋取模操作、位運算的小技巧、組合數、概率期望、進制轉換、最大公約數、最小公倍數、唯一分解定理、素數、快速冪等知識…

Redis下載穩定版本5.0.4

https://www.redis.net.cn/download/ Redis下載 Redis 版本號采用標準慣例:主版本號.副版本號.補丁級別,一個副版本號就標記為一個標準發行版本,例如 1.2,2.0,2.2,2.4,2.6,2.8,奇數的副版本號用來表示非標準版本,例如2.9.x發行版本是Redis 3.0標準版本的非標準發行版本…

?UniApp 安卓打包完整步驟(小白向)

? ?一、環境準備? ?安裝 HBuilderX? 下載最新版 HBuilderX 并安裝(官方 IDE,支持一鍵打包)?16確保已安裝 Node.js(用于依賴管理)?26 ?配置 Android 開發環境? 安裝 ?Java JDK 17?(建議選擇穩定…

【Springboot知識】Springboot配置加載機制深入解讀

文章目錄 配置加載概述**Spring Boot 配置加載機制詳解****一、配置加載順序(優先級由低到高)****二、關鍵配置機制說明****1. Profile 機制****2. 外部化配置****3. 配置屬性綁定到 Bean****4. 動態覆蓋配置** **三、配置加載流程圖****2. 配置導入&…

AI圖像生成

要通過代碼實現AI圖像生成,可以使用深度學習框架如TensorFlow、PyTorch或GANs等技術。下面是一個簡單的示例代碼,演示如何使用GANs生成手寫數字圖像: import torch import torchvision import torchvision.transforms as transforms import …

基于springboot的個人博客系統

一、系統架構 前端:html | bootstrap | jquery | css | ajax 后端:springboot | mybatis 環境:jdk1.8 | mysql | maven 二、代碼及數據 三、功能介紹 01. 注冊 02. 登錄 03. 管理后臺-首頁 04. 管理后臺-文章-所有文…

BOTA六維力矩傳感器如何打通機器人AI力控操作的三層架構?感知-決策-執行全鏈路揭秘

想象一下,你對著一個機器人說:“請幫我泡杯茶。”然后,它就真的開始行動了:找茶壺、燒水、取茶葉、泡茶……這一切看似簡單,但背后卻隱藏著復雜的AI技術。今天,我們就來揭秘BOTA六維力矩傳感器在機器人操控…

ffmpeg播放音視頻流程

文章目錄 🎬 FFmpeg 解碼播放流程概覽(以音視頻文件為例)1?? 創建結構體2?? 打開音視頻文件3?? 查找解碼器并打開解碼器4?? 循環讀取數據包(Packet)5?? 解碼成幀(Frame)6?? 播放 / …

在 Wireshark 中如何篩選數據包

1. 顯示過濾器(Display Filters) 顯示過濾器用于 在已捕獲的數據包中篩選,語法類似于編程語言中的條件表達式。 (1)基本過濾 表達式說明ip.addr 192.168.1.1顯示所有涉及 192.168.1.1 的 IP 包ip.src 192.168.1.1…

ES6 新增特性 箭頭函數

簡述: ECMAScript 6(簡稱ES6)是于2015年6月正式發布的JavaScript語言的標準,正式名為ECMAScript 2015(ES2015)。它的目標是使得JavaScript語言可以用來編寫復雜的大型應用程序,成為企業級開發語…

Python數據可視化-第7章-繪制3D圖表和統計地圖

環境 開發工具 VSCode庫的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本書為《Python數據可視化》一書的配套內容,本章為第7章 繪制3D圖表和統計地圖 本章首先介紹了使用mplot3d工具包繪制3D圖表,然后介紹了使用animation模塊制作動畫&#…

【從零開始學習JVM | 第二篇】HotSpot虛擬機對象探秘

對象的創建 1.類加載檢查 虛擬機遇到一條new的指令,首先去檢查這個指令的參數能否在常量池中定位到這個類的符號引用,并且檢查這個符號引用代表的類是否已被加載過、解析和初始化過。如果沒有,那必須先執行類的加載過程。 2.分配內存 在類…