ii *_*to1 1 mysql sql database innodb
我目前有一个 SQL 执行脚本,它更新重复键上的行,如下所示。
$stmt = $dbCon->prepare("INSERT INTO videos_rating (videos_rating_video_fk, "
. " videos_rating_user_fk, "
. " videos_rating_rating) "
. " VALUES (:video_id, "
. " :user_id, "
. " :video_rating) "
. " ON DUPLICATE KEY UPDATE videos_rating_rating = :video_rating");
Run Code Online (Sandbox Code Playgroud)
该脚本工作正常,但有没有办法防止自动增量列不同步?
假设我们从一个空表开始,然后我对一个视频进行评分,然后创建一个 id 为 1 的行,然后用户通过对同一视频评分较低或较高来再次执行 SQL,并且该行将被更新因为它现在是重复的密钥,所以肯定没问题。
问题是这样的。
下次另一个用户对新视频进行评分时,该行将从 id 3 而不是 2 开始?
表格将如下所示
id | videos_rating_user_fk | videos_rating_rating
1 | 1 | 4
3 | 2 | 5
Run Code Online (Sandbox Code Playgroud)
我无法找到类似的问题,即使我发现其他人不太可能对此感到困扰,如果是这样,请让我参考那篇文章。
我知道 ids 不应该“看起来不错”,但是 ids 从 30 - 51 - 82 - 85 - 89 等跳跃是非常烦人的,当达到最大 UNSIGNED big int 数字时,在某些时候不会有问题吗?我并不是说我会达到那么高,但仍然如此。
我假设您使用的是默认的InnoDB引擎。在这种情况下,“问题”是引擎会在知道 id 是否重复之前“保留”该 id。一旦 id 被“保留”,它就无法被释放,因为另一个线程(另一个用户)可能会在“同一”时间执行到同一个表的插入。还有其他方法可以在不删除任何行的情况下获取 AUTO_INCRMENT 列中的间隙。一种是回滚事务时。
您可以尝试在每次插入后“重置”下一个 AUTO_INCRMENT 值
alter table videos_rating auto_increment = 1;
Run Code Online (Sandbox Code Playgroud)
但我无法说出在运行的实时环境中执行此语句时可能会遇到什么问题。我不会发现这一点。
请注意,这通常不是问题,因为运行 IODKU 语句的表(通常)不需要 AUTO_INCREMENT 列。正如 Cid 在他的回答中所写,您可以删除该id列并将唯一键定义为主键。