在MySQL中,一個(gè)表的關(guān)系可能會(huì)引用另一個(gè)表中的數(shù)據(jù)。這個(gè)關(guān)系通常是通過外鍵來建立的,而外鍵通常是指它所引用表的某一列。
然而,有些時(shí)候外鍵可能會(huì)出現(xiàn)某些不便的情況,例如:
1. 數(shù)據(jù)庫中已經(jīng)存在很多數(shù)據(jù)并且存在外鍵關(guān)聯(lián),但是需要更改外鍵關(guān)聯(lián)的表結(jié)構(gòu)。這時(shí)候可能需要進(jìn)行大量的原始數(shù)據(jù)更改,導(dǎo)致操作復(fù)雜。
2. 多個(gè)表需要建立互相關(guān)聯(lián)的外鍵關(guān)系,但數(shù)據(jù)庫的表結(jié)構(gòu)并不支持這種多對(duì)多的關(guān)系,只支持一對(duì)多的關(guān)系。
為了解決這些問題,MySQL提供了“自己是自己的外鍵”這種特殊的關(guān)系。
CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50), manager_id INT, FOREIGN KEY (manager_id) REFERENCES employee(id) );
以上是一個(gè)簡單的employee表,其中包括id、name和manager_id等幾個(gè)字段。其中manager_id是外鍵,指明了employee表中的哪個(gè)人員是當(dāng)前人員的經(jīng)理。
可以看到,這個(gè)外鍵指向了employee表中的id列。由于MySQL支持自己是自己的外鍵,因此其實(shí)可以把外鍵直接指向當(dāng)前表中的某一列:
CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50), manager_id INT, FOREIGN KEY (manager_id) REFERENCES employee(id) );
同樣可以使用以上代碼實(shí)現(xiàn)功能。
使用自己是自己的外鍵的好處在于,可以避免對(duì)其他表的操作,簡化了表關(guān)系的建立和修改,而且甚至可以建立多對(duì)多的外鍵關(guān)系。
自己是自己的外鍵并不適用于所有數(shù)據(jù)庫的情況,因?yàn)樗赡軐?dǎo)致循環(huán)引用和重復(fù)記錄等問題。因此在使用自己是自己的外鍵時(shí)應(yīng)當(dāng)格外小心。