gpt4 book ai didi

mysql - AUTO_INCREMENT 在 MySql 更新

转载 作者:行者123 更新时间:2023-11-30 23:09:50 25 4
gpt4 key购买 nike

我有一个表,其中包含具有 version 字段的条目。

每当我更新或插入一行时,我想将版本字段设置为某个全局唯一计数器,例如插入时组合的 AUTO_INCREMENT 或更新时的 CURRENT_TIMESTAMP。是否可以在 MySql 的 SQL 语句中执行此操作?

例子:

+---+------+-----------+
|id | name |version |
+---+------+-----------+
|1 |a |1 |
|2 |b |2 |
|3 |c |3 |
+---+------+-----------+

UPDATE my_tbl SET name=foo WHERE id=1

+---+------+-----------+
|id | name |version |
+---+------+-----------+
|1 |foo |4 |
|2 |b |2 |
|3 |c |3 |
+---+------+-----------+

INSERT INTO my_tbl SET name=bar

+---+------+-----------+
|id | name |version |
+---+------+-----------+
|1 |foo |4 |
|2 |b |2 |
|3 |c |3 |
|4 |bar |5 |
+---+------+-----------+

我不能使用 AUTO_INCREMENT,因为它只在插入行时应用,而不是在更新时应用。 CURRENT_TIMESTAMP 都不是解决方案,因为时间戳在并发环境中可能不是唯一的。用户变量也无济于事,因为我需要一个全局唯一且递增的序列号,而不是单个 session 中的计数器。

最佳答案

虽然通过 ON UPDATE CURRENT_TIMESTAMP 更新的时间戳本身可能不是唯一的,但当与 id 列(已经是 auto_increment)结合使用时,您保证它们之间的唯一值。

因此,您可以通过以任何有意义的方式简单地连接两个值来计算查询中的版本。例如:id_timestampid_unix_timestamp(timestamp)

如果您非常需要以卓越的性能查询该值,请考虑跨两列创建复合索引。

 ALTER TABLE yourtable ADD INDEX `idx_id_timestamp` (`id`, `timestamp`)

您可以添加一个 UNIQUE 但这不是绝对必要的,因为 id 保证它已经作为主键。

如果绝对必要,可以使用更新触发器将每一行的连接值缓存到它自己的列中,但是当您通常可以在查询时生成它并拥有组合时,这会增加相当多的复杂性和一些重复索引可用于查询它。

关于mysql - AUTO_INCREMENT 在 MySql 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20313765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com