我们在创建父子表时,子表是需要自己的主键,还是应该使用父表的外键作为主键?
例子:
我有一个存储用户的表,其定义如下:
CREATE TABLE users (
'id' bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
'username' varchar(32),
PRIMARY KEY ('id'))
我想制作第二张表来存储更多关于用户的信息,比如他们最喜欢的动物。该表是否应该有自己的“id”列以及链接用户的单独外键?:
CREATE TABLE users_extra_info (
'id' bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
'fk_user_id' bigint(20) UNSIGNED NOT NULL,
'fav_mammal' varchar(32),
'fav_reptile' varchar(32),
...
PRIMARY KEY ('id'),
KEY 'fk_user_id' ('fk_user_id'))
或者由于外键必须是唯一的,您通常只是删除“id”列吗?:
CREATE TABLE users_extra_info (
'fk_user_id' bigint(20) UNSIGNED NOT NULL,
'fav_mammal' varchar(32),
'fav_reptile' varchar(32),
...
PRIMARY KEY ('fk_user_id'))
谢谢
最佳答案
原则上,与其他表无关,每个表都应该有一个PRIMARY KEY
,以便您能够区分一行与另一行。虽然并不总是需要绝对标识通常需要的各个行。
如果是真正的一对一关系(或一对零或一关系,也会发生),因为外键必然是唯一的它也可以用作主键的子表。在这种情况下,绝对没有理由引入第二个唯一列。
但是,一对一和一对零或一的关系不如一对多关系常见。在这种更常见的情况下,您不能只使用外键列作为主键,因为它们在子表中不是唯一的。在这种情况下,您可以选择引入一个额外的整数键或使用外键列和一个或多个其他列创建一个复合主键,这些列一起保证是唯一的。
关于mysql - 创建父子表,child 是否需要自己的主 id 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22702657/