2014-10-31 41 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