如下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_id
和film_id
设值时,只能1-1的for primary key。
(二)但是如果actor_id
设有自增auto_increment
,然后primary key
是 primary key(actor_id,film_id)
这种是联合还是复合?
(三)又或者设有自增的actor_id
,primary key(actor_id,name)
是复合还是联合?求大神解答一下疑惑,谢谢
这个问题要是问外国开发者,TA们能一脸懵逼。
在英文语境中只有
Composite Primary Key
(也有叫Compound Primary Key
的),就是一个表中如果是多个字段组成一个主键,那么这个主键就被称为这玩意儿。至于这玩意儿你翻译成“联合主键”、“组合主键”、“混合主键”还是“复合主键”,都特么是一回事儿。
结果到了中文编程界,不知道是哪位神仙起的头儿,非得编个“联合主键”和“复合主键”的区别出来。再加上中文编程界有一大特点,就是博客或者问答习惯性东抄西搬,结果错的知识也能流传广泛甚至成为“主流”。
搬一个“流传最广”的对于“联合主键”和“复合主键”区别的文章:
“联合主键”还是单一主键,只不过往往用在关联表里,一个关联表里会涉及到多个其他表的主键组合形成一条数据,你既可以为它们设置一个“复合主键”、也可以再新加一个自增列设为“联合主键”。
举例:
写在最后:
再次重申,这种概念是中文编程界(或者说是中文编程博客界)人为造出的。
上面的例子看看就得了,根本就是胡编一个
联合主键
的定义出来,你会发现它其实就是一个最简单的自增主键,只不过表的逻辑上student_id
+subject_id
是唯一的,id
就成了所谓的二者的联合主键
。