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

SQL 外鍵Foreign Key全解析

 更新時(shí)間:2025年05月14日 14:35:01   作者:不輝放棄  
外鍵是數(shù)據(jù)庫表中的一列(或一組列),用于??建立兩個(gè)表之間的關(guān)聯(lián)關(guān)系??,外鍵的值必須匹配另一個(gè)表的主鍵(Primary Key)或唯一約束(Unique Constraint)的值,這篇文章主要介紹了SQL 外鍵(Foreign Key)詳細(xì)講解,需要的朋友可以參考下

1. 什么是外鍵??? ??

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

??2. 外鍵的語法??

在創(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í),子表的外鍵如何處理?通過 ON DELETE 和 ON UPDATE 指定:

約束行為說明
??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),通過選課表(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. 常見問題??

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

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

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

??如何查看外鍵約束???
使用數(shù)據(jù)庫工具或查詢?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)詳細(xì)講解的文章就介紹到這了,更多相關(guān)SQL 外鍵Foreign Key內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

隆林| 乌鲁木齐县| 平度市| 灯塔市| 永嘉县| 壶关县| 阳新县| 厦门市| 赤城县| 浮梁县| 涞水县| 渝中区| 大悟县| 阜宁县| 渝北区| 塔城市| 尼木县| 育儿| 瑞昌市| 聊城市| 乌兰浩特市| 宣威市| 靖远县| 临泉县| 沂源县| 兴国县| 抚远县| 福泉市| 苍南县| 大城县| 吉木乃县| 登封市| 清水县| 普安县| 柞水县| 米泉市| 邵东县| 固安县| 冕宁县| 合肥市| 宜兰市|