色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

mysql外碼一定是主鍵嗎

張吉惟2年前10瀏覽0評論

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)化性能,建議外碼引用主鍵。