首页 > 解决方案 > MySQL递增值直到它在单个查询中唯一

问题描述

有没有办法增加一个值,直到它在单个 MySQL 查询中是唯一的?

假设您有一个以微时间记录 Unix 时间戳的表,并且您想插入一行,但是您可以将微时间递增,直到它成为唯一时间。在一个查询中,这可能吗?

在伪代码中,类似于(使用 PHP):

INSERT INTO items (time) VALUES (WHILE((SELECT COUNT(*) WHERE time={$newValue})>0,time = time+0.000001));

我知道伪代码不起作用,但希望它大致说明了我想做的事情。

标签: phpmysql

解决方案


这是一个通用的策略:

  • 首先,请确保您没有使用 microtime 作为主键...... (这与以下内容无关 - 这只是一个好习惯)

现在:

  1. BEGIN TRANSACTION (具有合适的隔离级别)
  2. SELECT MAX(microtime) FROM...找到现在存储的最大值。
  3. INSERT......有合适的时间。
  4. COMMIT

正确使用的事务将导致步骤#1-4 是原子的。 您可以在知道不会发生比赛的情况下执行步骤 #2 和 #3。您可以在“第 3 步”中进行任意数量的操作,并且所有这些操作都会同时发生。(或者,如果你改为ROLLBACK他们都没有。)


推荐阅读