【问题标题】:Mysql Insert consecutive rows per userMysql为每个用户插入连续的行
【发布时间】:2012-03-11 02:11:52
【问题描述】:

我有一个名为“picks”的表,当用户登录并开始选择时,它最初会在该用户的“picks”表中插入 64 行(以用户 ID 作为列)。这些行是使用 php 中的循环插入的,因此使用 PDO 准备好的语句有 64 个插入。每个用户只需执行一次。 我需要这些行对于该用户是连续的。如果其他几个用户在同一时间做同样的事情怎么办?是否有可能不会连续插入行?我需要使用表锁吗?我以前从未使用过它们。 MySql 版本:5.0.92-rs-log MyISAM 谢谢

【问题讨论】:

  • 我很好奇...为什么记录需要连续?
  • 由于某种原因,它似乎需要它们是连续的。当我写这个应用程序时,我很着急,可能写了一些糟糕的代码。稍后我将不得不重写一些 cade 以找出原因。
  • 如果您发布用于检索这些行的 sql,我们或许可以为您提供帮助。

标签: mysql insert rows table-locking


【解决方案1】:

对于实际上不需要它们的问题,我不会使用表锁。没有行应该是连续的。也许您是根据自动增量 ID 订购它们?如果是这种情况,它们可能不是连续的,但它们将是有序的。此外,如果您需要这些行的特定顺序,您始终可以添加另一列来设置实际顺序。

无论如何,请尝试扩展您的问题以获得更合适的帮助。

【讨论】:

    【解决方案2】:

    首先,应该有更好的方法来解决这个问题,而不是依赖于单个用户的 ID 是连续的。

    确实存在并发问题的可能性。在其他 DBMS 中,比如 Oracle,你有序列而不是 auto_increment,这更适合这种类型的事情。您可以使用只有一行的辅助表来模拟这一点。在这种情况下,您的 ID(或其他)字段不会设置为 auto_increment,并且您将拥有一个名为 sequence 的表(例如),您将在其中保存最后一个 ID。然后,在插入 64 条新记录之前,您将查询该表以获取最后一个 ID,然后对其进行更新。

    类似这样的(不要关注PHP函数,只是为了让代码易于理解):

    // Get the last ID
    $last_id = query('SELECT last_id FROM sequence LIMIT 1');
    
    // Store the last ID in your code and then update the new value
    $new_id = $last_id + 64;
    query('UPDATE sequence SET last_id = :new_id', array('new_id' => $new_id));
    
    // Make sure your DB class is set on auto_commit or commit the transaction here
    
    // Insert your new records
    for ($i = ++$last_id; $i < $new_id; $i++) {
        query('INSERT INTO picks (id, user_id) VALUES (:id, :user_id)', array('id' => $i, 'user_id' => $user_id));
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-24
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多