MySQL是一種廣泛使用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。其外碼(Foreign Key)是一種非常重要的約束,用于保證表間的數(shù)據(jù)一致性。那么問題來了,外碼是否一定要引用主鍵呢?
CREATE TABLE `table1` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) NOT NULL, `table2_id` INT(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE = INNODB; CREATE TABLE `table2` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `title` VARCHAR(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE = INNODB; ALTER TABLE `table1` ADD CONSTRAINT `fk_table2_id` FOREIGN KEY (`table2_id`) REFERENCES `table2` (`id`);
以上是一個簡單的示例,表1中有一個字段引用了表2的id字段作為外碼。那么,這樣的外碼一定要引用表2的主鍵嗎?
答案是否定的。在MySQL中,一個外碼只需要滿足引用字段(這里是table2_id)與被引用字段(這里是id)類型、長度相同,就可以定義為外碼。主鍵是常見的引用字段,但并不是唯一的引用字段。舉個例子,如果表2中有一個unique字段(唯一性約束),表1也可以引用該字段作為外碼。
CREATE TABLE `table2` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `title` VARCHAR(50) NOT NULL, `code` VARCHAR(10) NOT NULL UNIQUE, PRIMARY KEY (`id`) ) ENGINE = INNODB; ALTER TABLE `table1` ADD CONSTRAINT `fk_table2_code` FOREIGN KEY (`table2_code`) REFERENCES `table2` (`code`);
在以上示例中,表1中的table2_code字段引用了表2的code字段作為外碼,而code字段并不是主鍵。但這樣的設(shè)定并非最優(yōu)解,因為外碼引用主鍵可以帶來更好的性能,可以使用內(nèi)連接等操作。
綜上所述,MySQL中的外碼不一定要引用主鍵,只需滿足類型、長度相同即可。但為了最優(yōu)化性能,建議外碼引用主鍵。
上一篇css讓表格的框消失
下一篇mysql外碼是外鍵嗎