这个问题要是问外国开发者,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 就成了所谓的二者的 联合主键。