不同步自动增量MYSQL

时间:2014-10-31 14:18:18

标签: php mysql auto-increment sql-insert

我在其中一个表上有一个奇怪的行为,我不确定它是我的php代码还是数据库上的一些设置导致自动增加的id不同步。

如果我在名称和汽车上没有任何索引的情况下运行以下代码,我会得到:

    $cars = array("Volvo","BMW","Toyota");
    $name = "John Smith";

        foreach($cars as $value)
        {
                try 
                {

                 //insert into database with a prepared statement

                   $query = $db->prepare(
                   'INSERT INTO cars (name,cars) 
                   VALUES (:name,:cars) 
                   ');
                   $query->execute(array(           
                   ':name' => $name,
                   ':cars' => $value
                   ));

                }
                //else catch the exception and show the error.
                catch(PDOException $e) 
                {
                    $error[] = $e->getMessage();
                }   
        }

///Results
id || name       || cars
1  || John Smith || Volvo
2  || John Smith || BMW
3  || John Smith || Toyota

但是,如果我在名称和汽车上添加一个唯一索引,则自动增量会不同步,我无法理解为什么,因为我无法看到我的PHP代码有什么问题?

$cars = array("Volvo","BMW","Toyota");
    $name = "John Smith";

        foreach($cars as $value)
        {
                try 
                {

                 //insert into database with a prepared statement

                   $query = $db->prepare(
                   'INSERT INTO cars (name,cars) 
                   VALUES (:name,:cars) 
                   ');
                   $query->execute(array(           
                   ':name' => $name,
                   ':cars' => $value
                   ));

                }
                //else catch the exception and show the error.
                catch(PDOException $e) 
                {
                    $error[] = $e->getMessage();
                }   
        }

///Results
id || name       || cars
3  || John Smith || Toyota
1  || John Smith || Volvo
2  || John Smith || BMW

2 个答案:

答案 0 :(得分:2)

为什么你认为,这是不同步的?约翰的丰田仍然是3,他的沃尔沃是1

你如何得到你的结果?您只是SELECT cars,对吧?行为很好,因为没有任何ORDER BY语句没有必要按id排序数据。

您应该使用SELECT id, name, cars FROM cars ORDER BY id ASC进行查询。

使用mysql完全可以返回无序列表。 “unorder”只是一些内部优化的结果。

答案 1 :(得分:0)

两件事。

首先,自动增量通常会结束"不同步"以这种或那种方式。请查看MySQL AUTO_INCREMENT does not ROLLBACK,了解一个非常好的示例,说明为什么您不能期望自动增加主键ID同步"同步"与您的数据。 id是唯一的,它会递增。关于自动增量,你真的可以说的全部。

这导致了第二点。您当然不能说自动增量字段不会有间隙或将按排序顺序返回给您,除非您坚持它(@omeinusch和Mark Ba​​ker都在上面指出,并且它们都是正确的) 。在这里,我想指出的是,您的自动增量的行为完全符合预期。插入另一行。它的id为4。开始插入事务,将其回滚,然后插入另一行。它的id为6。这是故意的。插入100行,将其向后滚动,然后再插入100行。那批100将具有自动增量ID> 100.除非您在查询中添加ORDER BY id,否则他们不会按排序顺序返回给您。这是故意的。并且真的没有什么"不同步"关于它。