MySQL InnoDB自增次要列

4
我正在制作一个系统,让用户可以上传任何他们想要的文件,并且不使用它来执行任何类型的代码。作为其中的一部分,我会将每个文件重命名,并将其原始名称存储在MySQL表中。该表包含上传者的ID和上传的唯一ID。目前我是这样做的:
CREATE TABLE `uploads` (
    `user_id` INT(11) NOT NULL,
    `upload_id` INT(11) NOT NULL AUTO_INCREMENT,
    `original_name` VARCHAR(30) NOT NULL,
    `mime_type` VARCHAR(30) NOT NULL,
    `name` VARCHAR(50) NOT NULL,
    PRIMARY KEY (`user_id`, `upload_id`)
) ENGINE=MyISAM;

这意味着我将始终拥有唯一的用户ID和上传ID组合,每个用户的第一个上传ID为1。但是我想使用user_Id的外键,因此如果我删除一个用户,它的上传也会被删除。这意味着我必须在InnoDB中进行处理。由于上述设置仅在MyISAM中有效,所以我该怎么做呢?
我的用户表(从中获取user_id)如下:
    CREATE TABLE `".DATABASE."`.`users` (
    `user_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `username` VARCHAR(30) NOT NULL,
    `email` VARCHAR(50) NOT NULL,
    `password` CHAR(128) NOT NULL,
    `salt` CHAR(128) NOT NULL 
) ENGINE = InnoDB;

我想要的是上传表格看起来像这样:
user_id  | upload_id
1        | 1
1        | 2
2        | 1
2        | 2
2        | 3
1        | 3

如果有意义的话

2
你有什么问题? - byako
请描述您的表关系? - Nikunj Chotaliya
@DrewPierce 很高兴我做对了 :) - topisani
是的,但我需要它为每个用户重置。 - topisani
1
我在 http://mysql.rjweb.org/doc.php/myisam2innodb 中提到了一个解决方法。 - Rick James
显示剩余12条评论
2个回答

0

如果我理解正确:

用两个字段替换主键为唯一索引。将upload_id作为主键,user_id作为外键。


但这会使它自动递增吗? - topisani
是的,将能够上传您的upload_id字段。 - NullPointerException
你不能用这种方式为每个用户执行自动增量。你需要使用触发器或从应用程序中实现它。 - NullPointerException
这基本上就是我想要的,希望能找到一种方法,尽可能多地使用MySQL来获得类似的结果。 - topisani
那么我建议你学习触发器。虽然我不完全确定,但我认为这是你的情况下最好的解决方案。https://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html - NullPointerException

0

对于这个问题,自增列不会为每个用户重新从1开始。它将仅为每个添加的行递增,而不考虑任何特定的列值。

编辑:显示我的无知,MyISAM表显然会在这种情况下为每个用户从1开始,当一个多列索引这样做。https://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

幸运的是,也许没有必要让upload_id从每个用户的1开始。在该列上使用自动递增意味着即使不使用两个列作为主键,甚至创建唯一索引,因为每条记录都将具有不同的upload_id,您仍应该能够使用此设置实现级联删除。


是的,但我的MyISAM解决方案确实做到了这一点,尽管这并不是必需的,但我很喜欢它。 - topisani
抱歉我的误解,但它做了什么?它为每个用户重置了上传ID为1吗? - Don't Panic
是的 - 如此解释:(https://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html) - topisani
谢谢!我其实不知道它可以这样做。(显然。) - Don't Panic
是的,它非常方便,但遗憾的是在InnoDB中不可用,并且无法使用3列实现(这是我的下一个问题)。因此,我必须找到其他方法。 - topisani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接