2014-10-31 37 views
0

我有我与工作表中的一个怪异的行为,我不知道这是否是我的PHP代码或数据库上,是造成自动递增的ID掉下来的一些设置同步。不同步自动递增MYSQL

如果我的名字运行没有任何索引下面的代码&车,我得到:

$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 
+3

除非您的SELECT语句具有ORDER BY子句,否则__no不保证您的记录将以任何特定顺序返回 – 2014-10-31 14:22:33

+0

为什么要将名称/汽车作为唯一索引? – 2014-10-31 14:22:58

+0

我只想要一个名字和汽车的组合。除此之外,这对我来说没有用,因为我只会获得相同的信息,以至于这个人拥有这辆名车,其他所有东西都会作为数据库中的重复部分。 – user3882771 2014-10-31 14:36:10

回答

2

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

你如何得到你的结果?你只是SELECT你的cars,对吧?行为是好的,因为没有任何ORDER BY声明没有必要通过id命令数据。

您应该询问SELECT id, name, cars FROM cars ORDER BY id ASC

对于mysql来说,返回无序列表是完全可以的。 “无序”只是一些内部优化的结果。

+0

啊你确定吗?我很担心,因为虽然数字不是同步的顺序,这是我第一次看到它被随机顺序插入。通常我会用1,2,3,4,5等。不是3,1,5,2,4。你是对的,它只是一个没有ORDER BY的SELECT语句。所以这是正常的?我不应该担心我做错了什么? – user3882771 2014-10-31 14:33:15

+1

在数据库引擎重新组织表时,订单更改是完全正常的。 – tjati 2014-10-31 14:40:59

0

两件事。

首先,自动增量将通常以这种或那种方式结束了“不同步”。看一看MySQL AUTO_INCREMENT does not ROLLBACK就是一个非常好的例子,为什么你不能指望自动递增主键ID与你的数据“同步”。该ID是唯一的,它增加。关于自动增量,你可以这么说。

这导致第二点。你当然可以不说自动增量字段不会有间隙,或者按照排序顺序返回给你,除非你坚持这样(它既是@omeinusch也是Mark Ba​​ker在上面指出的,而且两者都是正确的)。在这里,我想指出的是,您的自动增量的行为完全如预期。插入另一行。它会有四个ID。开始插入事务,将其回滚,然后插入另一行。它会有六个ID。这是有意的。插入100行,将它们回滚,然后再插入100行。该批次的100将具有自动增量ID> 100.并且它们不会以排序顺序返回给您,除非您将ORDER BY ID添加到您的查询中。这是故意的。关于它并没有什么“不同步”。

+0

感谢您的澄清,我明白,当您删除一条记录时,最终会出现空白。但我不明白的是在我的脑海中,我认为foreach会循环每次迭代。所以在第一次迭代中它插入第一个ID,因此应该是1第一次,第二次迭代是第二次插入,因此2秒等等。因此,我认为在数据库中我预计会看到1,2,3。当我看到上面的结果时,我就像是呃!为什么第3次迭代首先进入,并不了解它们被分配了唯一的id,但并不意味着它们将被排序。我期待有序列表 – user3882771 2014-10-31 14:45:08

+0

常见的误解。如果它有帮助,SQL是关系型的,并且这在数学意义上是相关的(例如http://en.wikipedia.org/wiki/Relational_algebra)。不要把它想成有序列表。把它想象成一个集合。 – evanv 2014-10-31 15:01:15