關(guān)于MySQL是否支持外鍵,這個(gè)問(wèn)題已經(jīng)引起了不少的爭(zhēng)議。下面我們先看一下官方文檔的說(shuō)法:
MySQL強(qiáng)制外鍵語(yǔ)法: CREATE TABLE T1 ( id INT NOT NULL, PRIMARY KEY (id) ) ENGINE = INNODB; CREATE TABLE T2( id INT NOT NULL, t1_id INT, PRIMARY KEY (id), INDEX par_ind (t1_id), FOREIGN KEY(t1_id) REFERENCES T1(id) ON DELETE CASCADE ) ENGINE = INNODB;
從上面的語(yǔ)法可以看出,MySQL實(shí)際上是支持外鍵的,只是默認(rèn)情況下并不開(kāi)啟外鍵的約束。
因此,如果我們?cè)趧?chuàng)建表的時(shí)候,使用了“ENGINE=InnoDB”引擎,并在創(chuàng)建表時(shí)使用了“FOREIGN KEY”關(guān)鍵字,則MySQL就會(huì)支持外鍵了。但是這個(gè)特性并不是所有版本都支持,因此需要根據(jù)實(shí)際情況判斷。
MySQL版本檢查語(yǔ)句: SELECT VERSION();
當(dāng)然,MySQL不支持外鍵的說(shuō)法也有一些道理,因?yàn)镸ySQL即使開(kāi)啟了外鍵約束,對(duì)于某些不規(guī)范的操作,也不會(huì)強(qiáng)制執(zhí)行外鍵約束。比如:
如果一張表中已經(jīng)存在數(shù)據(jù),并且該表有外鍵約束,此時(shí)再添加數(shù)據(jù),如果新添加的數(shù)據(jù)違反了外鍵約束,MySQL也不會(huì)強(qiáng)制執(zhí)行外鍵約束。 此外,在刪除主表數(shù)據(jù)時(shí),如果子表中還有關(guān)聯(lián)數(shù)據(jù),MySQL也不會(huì)自動(dòng)刪除子表中的數(shù)據(jù),而只是會(huì)阻止刪除主表的數(shù)據(jù)。
因此,我們使用MySQL的外鍵約束時(shí),也需要在代碼中增加一些邏輯判斷,以確保數(shù)據(jù)的完整性和一致性。