Mysql为每个用户插入连续的行

时间:2012-03-11 02:11:52

标签: mysql insert rows table-locking

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

首先,应该有更好的方法来解决这个问题,而不是依赖于单个用户连续的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));
}