【问题标题】:Have more than one AutoIncrement Per Table每个表有多个 AutoIncrement
【发布时间】:2011-05-05 15:11:18
【问题描述】:

大家好,
我正在尝试制作一个包含一堆 id 引用用户的表,并且对于每个用户,都会有多个帖子也应该有自己的 id。我的问题是如何制作表格,以便在为某个用户插入记录时,他们的帖子 ID 应该增加 1。这意味着用户 1 将有帖子 1、2、3 和 4,用户 2 将有帖子1、2、3、4、5、6、7等……

event_id 是表的主键,FK_user_ID 是映射回用户表的外键,post_id 是该用户的帖子编号(这是我的问题列),post 是帖子

----------------------------------------------------
|  event_id  |  FK_user_ID  |  post_id  |   post   |
|      1     |       1      |      1    |   hey    |
|      2     |       1      |      2    | you too  |
|      3     |       1      |      3    |   ok     |
|      4     |       2      |      1    |   foo    |
|      5     |       2      |      2    |   bar    |
----------------------------------------------------

【问题讨论】:

  • 您能用 ASCII-art 显示您希望表格的外观(添加数据后)吗?我想我不明白这些条目与用户帖子的关系... =/
  • 这里真的需要两个自动增量吗?我相信useraldreay 在它自己的表中有一个自动增量。
  • @David 我将在今天晚些时候提出@Quassnoi 我实际上并不是指自动增量,而是可以充当一个的东西

标签: auto-increment mysql


【解决方案1】:

您不需要单独的表来存储每个用户的帖子吗?然后您可以通过用户 ID 链接它们,并在需要时使用连接来获取信息:

--------------------- |用户ID | Post_ID | | 1 | 1 | | 2 | 2 | | 2 | 3 | | 3 | 4 | | 4 | 5 | ---------------------

等等等等

【讨论】:

  • 我想尽量避免制作另一张桌子,因为我的印象是少即是多。但是,我在 MySQL 上有点菜鸟/黑客,所以我真的不知道。这只是一个小宠物项目,但如果我对 MySQL 有更多了解,添加另一个表是否比我上面要求的任何方式(如果可能)更有效?
  • 确实如此,尤其是当您使用外键时,可以实现快速索引。表分离和连接肯定不会对这样的事情产生显着的速度影响,而且我一直发现分离出这样的信息更好、更容易。
【解决方案2】:

每个表只能有一个自动增量。如果这是一项家庭作业,那么“开箱即用”的方法可能是为每个用户创建单独的表,而不是一个包含多列的表。然后,当使用单独的表时,您可以对每个表使用自动增量。然后,您只需创建一个视图将表格连接在一起以便于阅读。

【讨论】:

  • 这不完全是家庭作业,更像是我为自己做的一个小项目。如果存在这样的事情,我有兴趣做被认为是“正确的方式”。
【解决方案3】:

恐怕我认为每个表最多只能有一个 AUTO_INCREMENT 列。如here 所述,您可以将它放在复合索引中的辅助列上,但不能超过一个。

我认为您需要创建一个单独的用户表,将用户 ID (user.id) 作为对 post.user_id 的外键引用。

现在您可以在(user_id, post_sequence)post 上创建PRIMARY KEY,并在其列规范中使用AUTO_INCREMENT 定义post_sequence

【讨论】:

    【解决方案4】:

    使用MyISAM,这是可能的:

    CREATE TABLE posts (user_id INT NOT NULL, post_id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (user_id, post_id)) ENGINE=MyISAM;
    
    INSERT
    INTO    posts
    VALUES
    (1, NULL),
    (1, NULL),
    (1, NULL),
    (2, NULL),
    (2, NULL);
    

    结果:

    1, 1
    1, 2
    1, 3
    2, 1
    2, 2
    

    【讨论】:

      猜你喜欢
      • 2020-11-12
      • 2012-02-18
      • 2020-03-23
      • 2016-06-29
      • 2023-02-08
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      相关资源
      最近更新 更多