Mysql 主键实践

Mysql 主键实践,mysql,foreign-keys,innodb,Mysql,Foreign Keys,Innodb,将id作为主键是否毫无意义?考虑到我需要它作为另一个表的外键,我是否应该将id+user\u id作为主键?您必须将id作为主键,因为它是一个自动增量,并且您正在使用InnoDB。您可以在两列上创建一个唯一的索引(我将用户id放在第一位)以在子表外键中使用不是每个唯一的行组合都应该是主键。 可能您可以这样使用它,但这将是一个笨拙的解决方案。将主键显式标记为主键是一个好主意 这样,您就不必添加另一个索引,该索引将部分地将主键或外键复制到用户表中(尽管后者当前不存在) 另外,许多人似乎把身份字段和主

id
作为主键是否毫无意义?考虑到我需要它作为另一个表的外键,我是否应该将
id+user\u id
作为主键?

您必须将
id
作为主键,因为它是一个自动增量,并且您正在使用InnoDB。您可以在两列上创建一个唯一的索引(我将用户id放在第一位)以在子表外键中使用

不是每个唯一的行组合都应该是主键。
可能您可以这样使用它,但这将是一个笨拙的解决方案。

将主键显式标记为主键是一个好主意

这样,您就不必添加另一个索引,该索引将部分地将主键或外键复制到用户表中(尽管后者当前不存在)


另外,许多人似乎把身份字段和主键混淆了。标识字段可以很容易地成为主键的一部分(但如果表是InnoDB并且字段是自动递增的整数,则应该是前缀)。

在id上有key,user\id是毫无意义的,因为主键始终是InnoDB二级索引中的最后一个键(尽管优化器并不总是利用这一点),而且,因为只有在指定了最左边的部分时才可以使用键。因此,要么只在用户id上创建密钥,要么在用户id上创建唯一的accross user\u id/id。这样,您可以在查询
其中id=
其中user\u id=

Uhm中使用索引,为什么只有
id
对于另一个表中的FK来说还不够?媒体id和
user\u id
的组合是否唯一地标识了一行?使用InnoDB引擎,将PK设置为自动增量字段几乎不会出错。@zerkms在外键引用上建立索引不是更好吗?(在我的引用表vows.user_id+vows.id是一个唯一的键,所以实际上,它是制作FK的一个要求)所以我想知道除了我建议的复合键之外,我是否还需要主键=id。@zerkms在外键引用上有一个索引不是更好吗?(在我的参考表vows.user_id+vows.media_publication_id是一个唯一的键,所以实际上它是制作FK的一个要求)所以我想知道除了我建议的复合键之外,我是否还需要主键=id。@amiawizard:所以它本身对于查询user_id很有用
DROP TABLE IF EXISTS `media_publications`;
CREATE TABLE `media_publications` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `media_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `description` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY (`id`,`user_id`)
) ENGINE=INNODB;