提问关于 mysql得联合主键和复合主键的问题

如下sql:
CREATE TABLE film_actor (
actor_id smallint(5) unsigned NOT NULL,
film_id smallint(5) unsigned NOT NULL,
name varchar(50) NOT NULL,
last_update timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (actor_id,film_id) USING BTREE,
KEY idx_fk_film_id (film_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
(一)primary key 是联合主键还是复合主键,我个人理解的是联合主键,毕竟actor_id不是自增的?但是针对actor_idfilm_id设值时,只能1-1的for primary key。
(二)但是如果actor_id设有自增auto_increment,然后primary keyprimary key(actor_id,film_id)这种是联合还是复合?
(三)又或者设有自增的actor_idprimary key(actor_id,name)是复合还是联合?求大神解答一下疑惑,谢谢

阅读 10.4k
1 个回答

这个问题要是问外国开发者,TA们能一脸懵逼。

在英文语境中只有 Composite Primary Key(也有叫 Compound Primary Key 的),就是一个表中如果是多个字段组成一个主键,那么这个主键就被称为这玩意儿。

至于这玩意儿你翻译成“联合主键”、“组合主键”、“混合主键”还是“复合主键”,都特么是一回事儿。

结果到了中文编程界,不知道是哪位神仙起的头儿,非得编个“联合主键”和“复合主键”的区别出来。再加上中文编程界有一大特点,就是博客或者问答习惯性东抄西搬,结果错的知识也能流传广泛甚至成为“主流”。


搬一个“流传最广”的对于“联合主键”和“复合主键”区别的文章:

“联合主键”还是单一主键,只不过往往用在关联表里,一个关联表里会涉及到多个其他表的主键组合形成一条数据,你既可以为它们设置一个“复合主键”、也可以再新加一个自增列设为“联合主键”。

举例:

--- 学生表
CREATE TABLE `student` (
    `student_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(20) NOT NULL,
    PRIMARY KEY (`student_id`) USING BTREE
);

--- 科目表
CREATE TABLE `subject` (
    `subject_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(20) NOT NULL,
    PRIMARY KEY (`subject_id`) USING BTREE
);

--- 分数表,用所谓的“复合主键”
CREATE TABLE `score` (
    `student_id` int(10) unsigned NOT NULL,
    `subject_id` int(10) unsigned NOT NULL,
    `value` int(10) unsigned NOT NULL,
    PRIMARY KEY (`student_id`, `subject_id`) USING BTREE
);

--- 分数表,用所谓的“联合主键”
CREATE TABLE `score` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `student_id` int(10) unsigned NOT NULL,
    `subject_id` int(10) unsigned NOT NULL,
    `value` int(10) unsigned NOT NULL,
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE INDEX `un`(`student_id`, `subject_id`) USING BTREE
);

写在最后:

再次重申,这种概念是中文编程界(或者说是中文编程博客界)人为造出的。

上面的例子看看就得了,根本就是胡编一个 联合主键 的定义出来,你会发现它其实就是一个最简单的自增主键,只不过表的逻辑上 student_id + subject_id 是唯一的,id 就成了所谓的二者的 联合主键

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏