获取我的MySQL数据库表中未列出的第一个可用数字

时间:2012-11-20 22:17:12

标签: mysql sql numbers

任何用于获取MySQL数据库表中未列出的第一个数字的SQL? 例如:

表: 用户

ID  | Name   | Number
------------------------
1   | John   | 1456
2   | Phil   | 345
3   | Jenny  | 345612

在这种情况下,SQL必须返回行列表,其中行号从1到344,346到1455和1457到345611

有什么建议吗?也许有一些程序?

5 个答案:

答案 0 :(得分:1)

鉴于评论,我的第一种方法是使用“随机数”探测器。这种方法假定:

  1. Number已编入索引;和
  2. “可用数量”明显少于可用数量
  3. 方法:

    1. 在客户端上随机选择N(即1-10)个数字;
    2. 查询Number IN (ns..)的数据库,或Number = n的{​​{1}};然后
    3. 如果可以根据未找到所请求的记录来检测该号码。
    4. 在这种情况下,N=1的大小可能“没问题”并且它是最容易实现的,尽管它需要至少6个数据库请求才能找到6个空闲数字。较大的N=1会减少到数据库的次数。

      确保使用交易。

答案 1 :(得分:1)

我喜欢@pst的答案,但会提出另一种选择。

  1. 创建一个未分配号码的新表格,在那里插入几千行左右。

  2. 向用户展示其中一些数字。

  3. 使用数字时,请从未分配的数字表中删除它。

  4. 根据需要定期生成更多未分配的号码。

  5. 这些未分配数字的生成可以使用@pst建议的随机方法,但是使用这种方法可以移动生成未分配数字列表到批处理任务所需的时间的不确定性,而不是必须这样做当用户在等待时它在前端。如果数字空间的使用稀少,这可能不是问题,但随着使用更多的数字空间,它将成为一个更大的问题。

答案 2 :(得分:0)

只需使用自动增量列。数据库将自动分配下一个号码。您甚至不需要知道插入时它是什么。告诉用户他得到的号码,不要给他一个选择。

答案 3 :(得分:0)

SELECT 'start', 1 AS number FROM tableA
 UNION
SELECT 'min', number - 1 number FROM tableA
 UNION
SELECT 'max', number + 1 number FROM tableA
 ORDER BY number

您可以在http://www.sqlfiddle.com/#!2/851de/6

查看答案

然后,您可以在下次填充时对缺失的数字进行比较。

答案 4 :(得分:0)

根据您的意见,以下方法可能对您有用。它并没有真正回答您的具体问题,但它可能符合您的要求。

我将假设您的要求无法更改(例如,向用户提供6种可能的ID选择)。坦率地说,我认为这有点奇怪的要求,但它会产生一些有趣的SQL。 : - )

这是我的方法:生成10个随机数。过滤掉数据库中已有的任何内容。向您的用户提供其中6个随机数。与顺序id号相比,随机id号在事务性方面具有非常好的属性,因此如果你的应用程序变得流行,这应该非常好地扩展。

SELECT
  temp.i
FROM
  (
          SELECT 18 AS i   -- 10 random
    UNION SELECT 42        -- numbers.
    UNION SELECT 88        
    UNION SELECT 191       -- Let's assume
    UNION SELECT 192       -- you generated
    UNION SELECT 193       -- these in the
    UNION SELECT 1000      -- application
    UNION SELECT 123456    -- layer.
    UNION SELECT 1092930
    UNION SELECT 9892919
  ) temp
LEFT JOIN
  mytable ON (temp.i = mytable.i)
WHERE
  mytable.i IS NULL       -- filter out collisions
LIMIT
  6                       -- limit results to 6

SQL pop测验时间!!!

  • 为什么“WHERE mytable.i IS NULL”行过滤了碰撞? (提示:如果mytable.i是主键,它怎么能为空?)

以下是一些测试数据:

CREATE TABLE mytable (i BIGINT PRIMARY KEY) ;

INSERT INTO mytable VALUES (88), (3), (192), (123456) ;

运行上面的查询,这是结果。请注意,88,192和123456被过滤掉了,因为它们会与测试数据发生冲突。

+---------+
| i       |
+---------+
|      18 |
|      42 |
|     191 |
|     193 |
|    1000 |
| 1092930 |
+---------+

如何生成这些随机数?可能rand()* 9223372036854775807会起作用。 (假设你不想要负数!)