MySQL在更新为唯一值时自动递增列

aor9mmx1  于 2023-02-15  发布在  Mysql
关注(0)|答案(1)|浏览(151)

我有一个表,看起来像这样:

name: posts
columns: 
- id
- sequence_id
- text
- like_count

ID是标准的自动递增的唯一整数索引。
序列ID应该类似-它也是唯一的整数索引。
不同之处在于,我希望在 update或insert 而不仅仅是insert时将其递增到表中新的最大值。
目前,我使用Redis计数器来实现这一点,在插入到数据库之前,我会递增该计数器。
不过,如果可能的话,我想去掉对Redis的依赖,只使用MySQL。
我想到的一个选项是创建一个post_updates表,它只包含一个自动递增的ID,我也是这样使用的,但感觉更糟。
另一种选择是进行全列扫描,以达到max(sequence_id)+ 1,但这实际上不是可伸缩的,而且会有争用条件。
有没有我不知道的更好的选择?

2ic8powd

2ic8powd1#

手册中有一个在MySQL中模拟序列对象的解决方案:

CREATE TABLE sequence (id INT NOT NULL);
INSERT INTO sequence VALUES (0);

sequence表本身不需要自动递增,它只存储一行。
当您准备好在所描述的表中递增sequence_id时,首先按以下方式更新序列值:

UPDATE sequence SET id = LAST_INSERT_ID(id+1);

现在,您可以在插入/更新表时使用该值:

INSERT INTO posts SET sequence_id = LAST_INSERT_ID(), text = '...';

UPDATE posts SET sequence_id = LAST_INSERT_ID(), like_count = like_count+1;

请注意,这比自动递增要重一些,因为更新序列表会创建一个行锁,而不仅仅是自动递增锁。这可能会对流量速率设置上限,因为许多试图访问该表的并发客户端会相互排队。
如果你想要一个非常高吞吐量的解决方案,我建议继续使用Redis。

相关问题