溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mysql支持外鍵嗎

發(fā)布時(shí)間:2022-06-28 11:51:14 來源:億速云 閱讀:255 作者:iii 欄目:MySQL數(shù)據(jù)庫

本篇內(nèi)容主要講解“mysql支持外鍵嗎”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“mysql支持外鍵嗎”吧!

mysql支持外鍵。在MySQL中,外鍵主要用來建立主表與從表的關(guān)聯(lián)關(guān)系,可以為兩個(gè)表的數(shù)據(jù)建立連接,約束兩個(gè)表中數(shù)據(jù)的一致性和完整性;當(dāng)主表刪除某條記錄時(shí),從表中與之對應(yīng)的記錄也必須有相應(yīng)的改變。一個(gè)表可以有一個(gè)或多個(gè)外鍵,外鍵可以為空值,若不為空值,則每一個(gè)外鍵的值必須等于主表中主鍵的某個(gè)值;且外鍵中列的數(shù)目和對應(yīng)數(shù)據(jù)類型必須和主表的主鍵中的相同。

本教程操作環(huán)境:windows7系統(tǒng)、mysql8版本、Dell G3電腦。

mysql支持外鍵。

MySQL外鍵(FOREIGN KEY)

外鍵是指定表中與另一個(gè)表的另一個(gè)字段匹配的字段。外鍵對相關(guān)表中的數(shù)據(jù)設(shè)置了約束,這使MySQL能夠保持參照完整性。

外鍵用來建立主表與從表的關(guān)聯(lián)關(guān)系,為兩個(gè)表的數(shù)據(jù)建立連接,約束兩個(gè)表中數(shù)據(jù)的一致性和完整性。

對于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表)。

主表刪除某條記錄時(shí),從表中與之對應(yīng)的記錄也必須有相應(yīng)的改變。一個(gè)表可以有一個(gè)或多個(gè)外鍵,外鍵可以為空值,若不為空值,則每一個(gè)外鍵的值必須等于主表中主鍵的某個(gè)值。

我們來看看示例數(shù)據(jù)庫中的以下數(shù)據(jù)庫圖。

mysql支持外鍵嗎

我們有兩個(gè)表:customers和orders, 每個(gè)客戶都有零個(gè)或多個(gè)訂單,每個(gè)訂單只能屬于一個(gè)客戶。customers表和orders表之間的關(guān)系是一對多的,它orders由customerNumber字段指定的表中的外鍵建立。customers表中的customerNumber字段與orders表中的customerNumber主鍵字段相關(guān) 。

customers 表稱為父表或引用表,orders表稱為子表或引用表。

外鍵可以是一個(gè)列或一組列。子表中的列通常引用父表中的主鍵列。

表可以具有多個(gè)外鍵,子表中的每個(gè)外鍵可以引用不同的父表。

子表中的行必須包含父表中存在的值,例如,orders表中的每個(gè)訂單記錄必須具有customers表customerNumber中存在的值。因此,多個(gè)訂單可以引用同一個(gè)客戶,這種關(guān)系稱為一個(gè)(客戶)到多個(gè)(訂單)或一對多。

有時(shí),子表和父表是相同的。外鍵引用表的主鍵,例如,下employees表:

mysql支持外鍵嗎

reportTo列是一個(gè)外鍵,它引用employeeNumber作為employees表的主鍵的列,以反映員工之間的匯報(bào)結(jié)構(gòu),即每個(gè)員工向另一個(gè)員工匯報(bào),員工可以有零個(gè)或多個(gè)直接匯報(bào)。我們有一個(gè)關(guān)于自聯(lián)接教程可以幫助您根據(jù)這種表查詢數(shù)據(jù)。

reportTo外鍵也被稱為遞歸或自引用的外鍵。

外鍵強(qiáng)制執(zhí)行引用完整性,可幫助您自動(dòng)維護(hù)數(shù)據(jù)的一致性和完整性。例如,您無法為不存在的客戶創(chuàng)建訂單。

此外,您可以customerNumber在外鍵的刪除操作上設(shè)置級聯(lián),以便在刪除customers表中的客戶時(shí),也會(huì)刪除與客戶關(guān)聯(lián)的所有訂單。這節(jié)省了使用多個(gè)DELETE語句 或DELETE JOIN語句的時(shí)間和精力。

與刪除相同,您還可以在更新操作上為customerNumber外鍵定義級聯(lián),以便在不使用多個(gè)UPDATE語句或UPDATE JOIN語句的情況下執(zhí)行跨表更新。

注意:在MySQL中,InnoDB 存儲(chǔ)引擎支持外鍵,因此您必須創(chuàng)建InnoDB表才能使用外鍵約束。

mysql定義外鍵時(shí),需要遵守下列規(guī)則:

  • 主表必須已經(jīng)存在于數(shù)據(jù)庫中,或者是當(dāng)前正在創(chuàng)建的表。如果是后一種情況,則主表與從表是同一個(gè)表,這樣的表稱為自參照表,這種結(jié)構(gòu)稱為自參照完整性。

  • 必須為主表定義主鍵。

  • 主鍵不能包含空值,但允許在外鍵中出現(xiàn)空值。也就是說,只要外鍵的每個(gè)非空值出現(xiàn)在指定的主鍵中,這個(gè)外鍵的內(nèi)容就是正確的。

  • 在主表的表名后面指定列名或列名的組合。這個(gè)列或列的組合必須是主表的主鍵或候選鍵。

  • 外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同。

  • 外鍵中列的數(shù)據(jù)類型必須和主表主鍵中對應(yīng)列的數(shù)據(jù)類型相同。

為表創(chuàng)建外鍵

MySQL創(chuàng)建外鍵語法

以下語法說明如何在CREATE TABLE語句中的子表中定義外鍵。

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

讓我們更詳細(xì)地學(xué)習(xí)一下語法:

  • CONSTRAINT子句允許您為外鍵約束定義約束名稱。如果省略它,MySQL將自動(dòng)生成一個(gè)名稱。

  • FOREIGN KEY子句指定子表中引用父表中主鍵列的列。你可以把一個(gè)外鍵名稱放在FOREIGN KEY子句之后,或者讓MySQL為你創(chuàng)建一個(gè)名字。請注意,MySQL會(huì)自動(dòng)使用foreign_key_name名稱創(chuàng)建索引。

  • REFERENCES子句指定子表中的列所引用的父表及列。在規(guī)定的子表和父表的列數(shù)FOREIGN KEY和REFERENCES必須相同。

  • ON DELETE子句允許您定義刪除父表中的記錄時(shí)子表中記錄的內(nèi)容。如果省略O(shè)N DELETE子句并刪除父表中包含子表中記錄的記錄,MySQL將拒絕刪除。此外,MySQL還為您提供操作,以便您可以使用其他選項(xiàng),例如ON DELETE CASCADE  ,要求MySQL刪除子表中的記錄,當(dāng)父表中的記錄被刪除時(shí),記錄將引用父表中的記錄。如果您不希望刪除子表中的相關(guān)記錄,請改用ON DELETE SET NULL操作。MySQL會(huì)將子表中的外鍵列值設(shè)置為NULL刪除父表中的記錄時(shí),條件是子表中的外鍵列必須接受NULL值。請注意,如果您使用ON DELETE NO ACTION或ON DELETE RESTRICT操作,MySQL將拒絕刪除。

  • ON UPDATE子句使您可以指定更新父表中的行時(shí)子表中的行會(huì)發(fā)生什么。您可以省略O(shè)N UPDATE子句,以便在更新父表中的行時(shí)讓MySQL拒絕對子表中行的任何更新。ON UPDATE CASCADE操作允許您執(zhí)行跨表更新,并且當(dāng)更新父表ON UPDATE SET NULL中的行時(shí),操作會(huì)將子表中的行中的值重置為值NULL。ON UPDATE NO ACTION或UPDATE RESTRICT行動(dòng)拒絕任何更新。

MySQL創(chuàng)建表外鍵示例

下面的示例創(chuàng)建一個(gè)dbdemo數(shù)據(jù)庫和兩個(gè)表:categories和  products.每個(gè)類別具有一個(gè)或多個(gè)產(chǎn)品和每個(gè)產(chǎn)品只屬于一個(gè)類別。products表中的cat_id字段被定義為帶有UPDATE ON CASCADE和DELETE ON RESTRICT操作的外鍵。

CREATE DATABASE IF NOT EXISTS dbdemo;
 
USE dbdemo;
 
CREATE TABLE categories(
   cat_id int not null auto_increment primary key,
   cat_name varchar(255) not null,
   cat_description text
) ENGINE=InnoDB;
 
CREATE TABLE products(
   prd_id int not null auto_increment primary key,
   prd_name varchar(355) not null,
   prd_price decimal,
   cat_id int not null,
   FOREIGN KEY fk_cat(cat_id)
   REFERENCES categories(cat_id)
   ON UPDATE CASCADE
   ON DELETE RESTRICT
)ENGINE=InnoDB;

將外鍵添加到表中

MySQL添加外鍵語法

要將外鍵添加到現(xiàn)有表,請使用帶有上述外鍵定義語法的ALTER TABLE語句:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;

MySQL添加外鍵示例

現(xiàn)在,讓我們添加一個(gè)名為vendors的新表,并更改products表以包含供應(yīng)商ID字段:

USE dbdemo;
 
CREATE TABLE vendors(
    vdr_id int not null auto_increment primary key,
    vdr_name varchar(255)
)ENGINE=InnoDB;
 
ALTER TABLE products 
ADD COLUMN vdr_id int not null AFTER cat_id;

要向表中添加外鍵products,請使用以下語句:

ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;

mysql支持外鍵嗎

現(xiàn)在,products表有兩個(gè)外鍵,一個(gè)引用categories表,另一個(gè)引用vendors表。

到此,相信大家對“mysql支持外鍵嗎”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI