【问题标题】:Mysql non-sequential insert problemMysql非顺序插入问题
【发布时间】:2011-08-08 02:16:37
【问题描述】:

我有一个包含 100,000 条记录的表,描述为:

ID primary unique int (5)
Ticket unique int (5)
user varchar (20)

只有在该表上填充的字段是前两个字段,ID 和 Ticket。我现在需要在请求时将用户分配给该票证。我怎样才能做到这一点?如何找到下一个空用户在桌子上的位置?

编辑:按要求解释场景

它是一种彩票系统。票号已经生成并填充到表格中。现在,当用户注册一张票时,他们的用户名必须插入到下一个可用票的旁边,在用户字段中。我确定有一种更简单的方法可以通过在新表上插入带有所有信息的票证来做到这一点,但这是听起来很愚蠢的确切要求。

那么我怎样才能找出下一个空用户在桌子上的位置呢?

【问题讨论】:

  • 您已经有 ID 列,按 ID 列插入用户。
  • @Stewie,怎么样? INSERT INTO TABLE table (user) VALUES ('user') WHERE id = ???
  • 你能解释一下你的场景吗?哪个表保​​存了这些信息?这张桌子的作用是什么?你想如何使用这个 ID 和 Ticket?
  • @Aswhine Dhekane/ 用场景编辑帖子

标签: php mysql insert null


【解决方案1】:

这假设 ID 是自动递增的。

首先查找用户字段为空的第一条记录:

Select * from users where user is null order by id asc limit 1;

然后填写:

Update users set user = [username] where id = [id from select];

【讨论】:

  • 请注意,ID 不是自动递增的,请参阅上述问题中的表格布局。
  • @Johan - 他确实提到了这一点,是的,但似乎喜欢我的回答。在我看来,从他描述问题的方式来看,他并没有考虑按 ID 进行选择,而只是考虑了 Ticket 字段(不会是连续的)。
【解决方案2】:

您也可以在单个查询中完成:

UPDATE users SET user = [username] where id = 
(select min(id) from users where user is null) 

【讨论】:

    【解决方案3】:

    通过执行以下操作查找下一个 NULL 行:

    SELECT ID 
    FROM Ticket
    WHERE user IS NULL 
    LIMIT 1;
    

    当您更新时,您必须小心,不要与另一个进程也获得相同 ID 的竞争条件。您可以通过拥有一个单独的表来保存TicketAllocation,并为其提供一个指向Ticket 表的唯一外键约束来防止这种重复分配问题。

    【讨论】:

      【解决方案4】:

      表格的排序方案是什么?

      如果 ID 编号是连续的,这应该可以:

      SELECT ID FROM TABLE WHERE user is null ORDER by ID LIMIT 1
      

      如果 ID 编号是非连续的,并且您可以使用表格的自然排序(按输入时排序)

      SELECT ID FROM TABLE WHERE user is null LIMIT 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多