【问题标题】:MySQL - generating unique id like auto-incrementMySQL - 生成唯一ID,如自动增量
【发布时间】:2016-09-27 19:45:40
【问题描述】:

我们有一个这样的表来维护每个“文章”的“cmets”。我们有数百万篇文章,每篇文章可能有多个 cmet。

我们要求“id”对于每篇“文章”都是唯一的,但不一定在所有文章中都是唯一的。

在当前的方法中,我们先插入然后使用 mysql_insert_id() 来获取“id”,因此不需要额外的查询来获取生成的“id”。

 CREATE TABLE `comments` (
   id bigint unsigned NOT NULL AUTO_INCREMENT,
   article int unsigned int default 0,
   PRIMARY KEY (id)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这种方法有效,但从某种意义上说,我们需要使用 bigint 作为“id”,尽管我们不希望每篇文章的 cmets 超过几千个,但这种方法有点过头了。我们可以手动维护 id,但缺点是它需要额外的查询来获取“id”,我们只需调用 mysql_insert_id()。如果可以在文章范围内自动增加“id”,这将很容易。

任何关于更好方法的建议,以便

  1. 我们可以生成一个较小的“id”,它对于一篇文章是唯一的,但不一定在所有文章中都是唯一的。
  2. 无需额外查询即可生成“id”

谢谢

【问题讨论】:

  • 你可以为每篇文章实现一个序列来完成你所需要的。

标签: mysql sql auto-increment


【解决方案1】:

这种方法有效,但从某种意义上说,我们需要这样做 使用 bigint 作为 'id' 即使我们不期望每篇文章有 cmets 超过几千。

我不认为这是必要的。想象一下,您想在应用程序的某些部分输出最近的 cmets:

  • 使用当前设计,您可以显示信息并拥有url/viewComment/commentId={commentId} 之类的链接。
  • 如果评论可通过articleId 和commentInternalId 识别,则所有网址都需要两个ID

生成id 的一种方法是(基于1):

(COUNT(1) FROM `comments` WHERE article = {article}) + 1

但它显然比使用自动增量更复杂和昂贵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2022-01-18
    • 2011-08-14
    相关资源
    最近更新 更多