最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL外鍵(Foreign?Key)實(shí)際應(yīng)用示例?詳細(xì)講解

 更新時(shí)間:2026年02月06日 11:52:10   作者:不輝放棄  
外鍵與主鍵相對(duì),作用就是通過(guò)主外鍵的之間關(guān)系使對(duì)張表中的數(shù)據(jù)更好的關(guān)聯(lián),這篇文章主要介紹了SQL外鍵(Foreign?Key)實(shí)際應(yīng)用示例?的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

1. 什么是外鍵???

  • ??定義??:外鍵是數(shù)據(jù)庫(kù)表中的一列(或一組列),用于??建立兩個(gè)表之間的關(guān)聯(lián)關(guān)系??。外鍵的值必須匹配另一個(gè)表的主鍵(Primary Key)或唯一約束(Unique Constraint)的值。
  • ??作用??:
    • 確保數(shù)據(jù)的??引用完整性??(Referential Integrity),防止無(wú)效數(shù)據(jù)插入。
    • 維護(hù)表之間的邏輯關(guān)系(如“一對(duì)多”或“多對(duì)多”)。

??2. 外鍵的語(yǔ)法??

在創(chuàng)建表時(shí)定義外鍵:

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

在已有表中添加外鍵:

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

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

當(dāng)父表的記錄被刪除或更新時(shí),子表的外鍵如何處理?通過(guò) ON DELETE 和 ON UPDATE 指定:

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

??4. 多列外鍵??

外鍵可以由多個(gè)列組成,需滿足:

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

??示例??:

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

??5. 外鍵的限制與注意事項(xiàng)??

  • ??父表必須有主鍵或唯一約束??。
  • ??外鍵列的數(shù)據(jù)類型必須與父表主鍵一致??。
  • ??引擎支持??:如 MySQL 的 InnoDB 支持外鍵,而 MyISAM 不支持。
  • ??性能影響??:外鍵會(huì)增加數(shù)據(jù)操作的檢查開銷,但能提升數(shù)據(jù)一致性。
  • ??循環(huán)依賴??:避免兩個(gè)表互相引用。

??6. 實(shí)際應(yīng)用示例??

??場(chǎng)景??:學(xué)生表(students)和課程表(courses),通過(guò)選課表(enrollments)關(guān)聯(lián)。

-- 父表:學(xué)生表
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
);

??插入數(shù)據(jù)??:

-- 插入學(xué)生和課程
INSERT INTO students VALUES (1, 'Alice');
INSERT INTO courses VALUES (101, 'Math');

-- 合法插入:學(xué)生和課程存在
INSERT INTO enrollments VALUES (1, 101, '2023-10-01');

-- 非法插入:學(xué)生不存在,觸發(fā)外鍵錯(cuò)誤
INSERT INTO enrollments VALUES (999, 101, '2023-10-01'); -- 報(bào)錯(cuò)!

??7. 常見問(wèn)題??

  • ??外鍵必須指向主鍵嗎???
    不,可以指向父表的唯一約束(Unique Constraint)。

  • ??能否跨數(shù)據(jù)庫(kù)引用???
    通常不支持,外鍵需在同一數(shù)據(jù)庫(kù)內(nèi)。

  • ??外鍵是否允許 NULL???
    如果外鍵列允許 NULL,則插入 NULL 是合法的(表示無(wú)關(guān)聯(lián))。

  • ??如何查看外鍵約束???
    使用數(shù)據(jù)庫(kù)工具或查詢?cè)獢?shù)據(jù)(如 MySQL 的 SHOW CREATE TABLE)。

??8. 總結(jié)??

  • ??外鍵的核心作用??:維護(hù)數(shù)據(jù)的一致性和關(guān)聯(lián)性。
  • ??適用場(chǎng)景??:需要強(qiáng)數(shù)據(jù)完整性的系統(tǒng)(如電商、金融)。
  • ??慎用場(chǎng)景??:高并發(fā)寫入且對(duì)性能要求極高的系統(tǒng)(需權(quán)衡一致性與性能)。

到此這篇關(guān)于SQL外鍵(Foreign Key)實(shí)際應(yīng)用的文章就介紹到這了,更多相關(guān)SQL外鍵詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ORACLE查看當(dāng)前連接數(shù)的常見方法及解釋

    ORACLE查看當(dāng)前連接數(shù)的常見方法及解釋

    做數(shù)據(jù)庫(kù)開發(fā)的時(shí)候,有時(shí)候會(huì)遇到連接超出最大限制的問(wèn)題,這時(shí)候,我們需要查看數(shù)據(jù)庫(kù)的連接數(shù),這篇文章主要介紹了ORACLE查看當(dāng)前連接數(shù)的常見方法及解釋,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • oracle基本查詢操作子查詢用法實(shí)例分析

    oracle基本查詢操作子查詢用法實(shí)例分析

    這篇文章主要介紹了oracle基本查詢操作子查詢用法,結(jié)合實(shí)例形式分析了oracle數(shù)據(jù)庫(kù)子查詢相關(guān)概念、原理、語(yǔ)法、使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • oracle10g 數(shù)據(jù)備份與導(dǎo)入

    oracle10g 數(shù)據(jù)備份與導(dǎo)入

    oracle10g 數(shù)據(jù)備份與導(dǎo)入 實(shí)現(xiàn)方法
    2009-06-06
  • Oracle表空間詳解

    Oracle表空間詳解

    這篇文章主要介紹是Oracle表空間管理,文章中有詳細(xì)的代碼示例,對(duì)學(xué)習(xí)有一定的幫助,感興趣的小伙伴可以參考一下
    2023-04-04
  • Oracle中序列(Sequence)示例詳解

    Oracle中序列(Sequence)示例詳解

    序列(SEQUENCE)是序列號(hào)生成器,可以為表中的行自動(dòng)生成序列號(hào),產(chǎn)生一組等間隔的數(shù)值(類型為數(shù)字)。不占用磁盤空間,占用內(nèi)存,這篇文章主要介紹了Oracle中序列(Sequence)詳解,需要的朋友可以參考下
    2023-09-09
  • SQL中Charindex和Oracle中對(duì)應(yīng)的函數(shù)Instr對(duì)比

    SQL中Charindex和Oracle中對(duì)應(yīng)的函數(shù)Instr對(duì)比

    在項(xiàng)目中用到了Oracle中 Instr 這個(gè)函數(shù),順便仔細(xì)的再次學(xué)習(xí)了一下這個(gè)知識(shí),使用 Instr 函數(shù)對(duì)某個(gè)字符串進(jìn)行判斷,判斷其是否含有指定的字符
    2013-10-10
  • 解析jdbc處理oracle的clob字段的詳解

    解析jdbc處理oracle的clob字段的詳解

    本篇文章是對(duì)jdbc處理oracle的clob字段進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • oracle(plsql)生成流水號(hào)

    oracle(plsql)生成流水號(hào)

    這篇文章主要介紹了oracle(plsql)生成流水號(hào),需要的朋友可以參考下
    2014-03-03
  • oracle初始化參數(shù)設(shè)置

    oracle初始化參數(shù)設(shè)置

    oracle初始化參數(shù)設(shè)置...
    2007-03-03
  • Oracle數(shù)據(jù)庫(kù)自動(dòng)備份腳本分享(超實(shí)用)

    Oracle數(shù)據(jù)庫(kù)自動(dòng)備份腳本分享(超實(shí)用)

    這篇文章主要給大家分享介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)自動(dòng)備份腳本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12

最新評(píng)論

安阳市| 哈巴河县| 临朐县| 海城市| 衡东县| 景东| 岱山县| 房产| 资阳市| 屯门区| 宁都县| 泸溪县| 板桥市| 洞头县| 兴化市| 泗水县| 贵德县| 江川县| 彰化市| 安岳县| 四子王旗| 罗甸县| 乌拉特中旗| 固原市| 吴川市| 南昌市| 江川县| 陕西省| 惠安县| 孝昌县| 申扎县| 苍山县| 凤翔县| 凯里市| 甘南县| 江津市| 临高县| 正宁县| 泽普县| 永定县| 项城市|