具有自动增量列重新启动的mysql表

具有自动增量列重新启动的mysql表,mysql,Mysql,标题可能不是很明显,我会尽力解释我想要什么。 我在这里发现了很多像我一样的问题,但答案对我没有帮助 假设我在视频网站上有这个表和它的字段: Comments ID | IDuser | IDvideo | comment 我想将我的主键设置为ID和IDuser字段的组合。 IDuser来自用户表。 ID是一个自动增量列 但我希望它能像这个例子一样工作 1 | 2 | 3 | "this is the first comment of user 2 in the video 3" 2 | 2 |

标题可能不是很明显,我会尽力解释我想要什么。 我在这里发现了很多像我一样的问题,但答案对我没有帮助

假设我在视频网站上有这个表和它的字段:

Comments
ID | IDuser | IDvideo | comment
我想将我的主键设置为ID和IDuser字段的组合。 IDuser来自用户表。 ID是一个自动增量列

但我希望它能像这个例子一样工作

1 | 2 | 3 | "this is the first comment of user 2 in the video 3"
2 | 2 | 4 | "this is the first comment of user 2 in the video 4"
3 | 2 | 4 | "this is the second comment of user 2 in the video 4"
1 | 3 | 3 | "this is the first comment of user 3 in the video 3"
看到了吗?就像每个用户都有自己的自动增量范围

我之所以要这样做,是因为否则第一列将有一个非常大的数字,因为每个注释都有一个顺序ID

你有什么建议给我吗

多谢各位

  • 首先,不能以这种方式使用自动增量
  • 第二,你不应该
  • 自动增量用于为表创建
    ID
    行。每一行都应该有自己的唯一ID

    如果您想拥有用户评论的相对ID,您应该创建一个新的COLLMN,其值应该手动设置

    祝你好运

    编辑
    在您的情况下,您的桌子应该是这样的:

    UPDATE users SET LastCommentID = LastCommentID + 1 WHERE UserID = 123
    SELECT LastCommentID FROM users WHERE UserID = 123
    
    • id
      INT无符号自动递增
    • idUser
      INT无符号索引外键
    • idVideo
      INT无符号索引外键
    • idUserComment
      INT未签名
    • Comment
      Varchar
    但是我不建议你有一个相对的ID,除非它对你的应用程序有意义

  • 首先,不能以这种方式使用自动增量
  • 第二,你不应该
  • 自动增量用于为表创建
    ID
    行。每一行都应该有自己的唯一ID

    如果您想拥有用户评论的相对ID,您应该创建一个新的COLLMN,其值应该手动设置

    祝你好运

    编辑
    在您的情况下,您的桌子应该是这样的:

    UPDATE users SET LastCommentID = LastCommentID + 1 WHERE UserID = 123
    SELECT LastCommentID FROM users WHERE UserID = 123
    
    • id
      INT无符号自动递增
    • idUser
      INT无符号索引外键
    • idVideo
      INT无符号索引外键
    • idUserComment
      INT未签名
    • Comment
      Varchar

    但我不建议您使用相对ID。除非它对您的应用程序有一定意义

    尽管,正如jgabriel所说,您可能不应该这样做,但我确实看到您尝试实现的目标有一些价值

    然而,你可能想问自己“为什么一个独特的ID仍然有用?”。。。因为每次引用注释时,都需要(ID,UserID)而不仅仅是(ID)。这意味着所有引用都需要在引用您的注释的任何其他表中包含2列。。。。这就是说:


    方法是将ID放入用户表中:

    Users
    UserID | LastCommentID | ...
    123    | 0             | ...
    
    您将“最后一条评论ID”初始化为零(0),这意味着用户没有发表任何评论

    当您为用户发布评论时,您只需执行以下操作:

    UPDATE users SET LastCommentID = LastCommentID + 1 WHERE UserID = 123
    SELECT LastCommentID FROM users WHERE UserID = 123
    
    并使用该值

    您可能不必担心锁定机制,因为用户永远不能同时发布两条评论


    一个明显的优势是,从速度上看,你不需要计算用户发表的评论数量就可以知道用户发表了多少评论。您只需阅读LastCommentID(尽管如果您不想计算已删除或隐藏的评论,这可能没有多大用处)。

    尽管正如jgabriel所说,您可能不应该这样做,但我确实看到您试图实现的目标有一定的价值

    然而,你可能想问自己“为什么一个独特的ID仍然有用?”。。。因为每次引用注释时,都需要(ID,UserID)而不仅仅是(ID)。这意味着所有引用都需要在引用您的注释的任何其他表中包含2列。。。。这就是说:


    方法是将ID放入用户表中:

    Users
    UserID | LastCommentID | ...
    123    | 0             | ...
    
    您将“最后一条评论ID”初始化为零(0),这意味着用户没有发表任何评论

    当您为用户发布评论时,您只需执行以下操作:

    UPDATE users SET LastCommentID = LastCommentID + 1 WHERE UserID = 123
    SELECT LastCommentID FROM users WHERE UserID = 123
    
    并使用该值

    您可能不必担心锁定机制,因为用户永远不能同时发布两条评论


    一个明显的优势是,从速度上看,你不需要计算用户发表的评论数量就可以知道用户发表了多少评论。您只需阅读LastCommentID(虽然如果您不想计算已删除或隐藏的评论,这可能没有多大用处。)

    为什么您认为大数字会对您造成问题?我不知道。感觉不对。在MySQL中,您可以为字段指定的最大数值是多少?如果您只使用
    unsigned int
    (4294967295),并且您希望页面运行30年,那么该数字就足以支持每秒4条注释。使用
    unsigned bigint
    每秒可以有数千条注释,但我认为这两种方法都会有其他问题。你是对的。就像jgabriel说的。使用unsigned int或bigint就足够了。这不会是一个问题。我想我不必为此担心。非常感谢。为什么你认为大数字会给你带来问题?我不知道。感觉不对。在MySQL中,您可以为字段指定的最大数值是多少?如果您只使用
    unsigned int
    (4294967295),并且您希望页面运行30年,那么该数字就足以支持每秒4条注释。使用
    unsigned bigint
    每秒可以有数千条注释,但我认为这两种方法都会有其他问题。你是对的。就像jgabriel说的。使用unsigned int或bigint就足够了。这不会是一个问题。我想我不必为此担心。感谢