我有一个表格,其中包含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既不是解决方案,因为时间戳在并发环境中可能不是唯一的。用户变量也无济于事,因为我需要一个全局唯一且递增的序列号,而不是单个会话中的计数器。
答案 0 :(得分:0)
虽然通过ON UPDATE CURRENT_TIMESTAMP
更新的时间戳可能不是唯一的,但当与id
列(已auto_increment
)结合使用时,您保证它们之间具有唯一值。
因此,您可以通过简单地以任何有意义的方式连接这两个值来计算查询中的版本。例如:id_timestamp
或id_unix_timestamp(timestamp)
。
如果您非常需要以卓越的性能查询该值,请考虑在两列中创建复合索引。
ALTER TABLE yourtable ADD INDEX `idx_id_timestamp` (`id`, `timestamp`)
您可以添加UNIQUE
,但这并非绝对必要,因为id
保证已经作为主键。
如果绝对必要,可以使用更新触发器将每行的连接值缓存到它自己的列中,但这会增加很多复杂性,并且当您通常在查询时生成并具有复合时会产生一些重复索引可用于查询它。