2013-03-10 171 views
0

我需要選擇什麼設置來在刪除某個值時維護有序隊列。我創建帶有自動增量和主鍵的id表。當我第一次插入數值的時候沒問題。像1,2,3,4,5...刪除一些值時,訂單更改如1,5,3...。腳本運行不正常。Mysql配置/設置

一些代碼:

if(isset($submit)){ 

    if($pav2 == ""){ 
     header('Location: index.php'); 
    } 

    else { 

    $select = mysql_query("SELECT new_id from naujiena ORDER by new_id"); 
    $zym = mysql_num_rows($select); 

    if($zym == 0) { 
    $query = mysql_query("INSERT INTO naujiena (new_id,new_pav) VALUES ('1','$pav2')"); 
    header('Location: index.php'); 
    } 

    else { 
     $select2 = mysql_query("SELECT new_id from naujiena ORDER BY new_id DESC LIMIT 1"); 
     $max_public_id = mysql_fetch_row($select2); 
     $query2 = mysql_query("INSERT INTO naujiena (new_id,new_pav) VALUES ('$max_public_id[0]'+1,'$pav2')"); 

     header('Location: index.php'); 
    } 

    } 
} 

當new_pav和NEW_ID剛纔說: 例子:

new_id new_pav 
5  some_value 
4  some_value 
3  some_value 
2  some_value 
1  some_value 

當我刪除的東西就變成: 例如:

new_id new_pav 
4  some_value 
2  some_value 
3  some_value 
1  some_value 
+0

請添加表格結構,示例數據,預期輸出和恰好卡住的位置。 – 2013-03-10 11:59:45

+0

嘗試使用ROW_NUMBER()函數而不是id請參閱堆棧:http://stackoverflow.com/questions/1895110/row-number-in-mysql – shola 2013-03-10 12:34:45

+0

仍然需要幫助;/ – user2149578 2013-03-10 12:45:25

回答

1

你在這裏關心的是一個常見的誤解數據庫中的表格是什麼。

當您從空白表格開始,並添加幾行時,主鍵會爲您提供一系列遞增的唯一值。做一個簡單的SELECT * FROM MyTable會給你這個:

MyTable 
ID other columns 
1 row1 
2 row2 
3 row3 
4 row4 
5 row5 

好漂亮,是吧?現在,當您從該表中刪除行時,例如行2和4,你會期望同樣選擇給你:

MyTable 
ID other columns 
1 row1 
3 row3 
5 row5 

不幸的是它是如何工作的,你可能會這樣,而不是越來越:

​​

不好漂亮。原因很簡單:當您運行SELECT * FROM MyTable查詢時,查詢返回行的順序爲undefined。數據庫可能會給予任何它想要的訂單,除非你指定了某個訂單。

如果你真的想讓行按照一定的順序排列,你需要這樣說

SELECT * FROM MyTable ORDER BY id會給你你要找的。

現在爲什麼它在第一個地方工作?爲什麼在你刪除東西之前,這些行是完美的?它恰好是數據庫可以從新表中檢索數據的最有效的命令 - 僅此而已。如果數據庫有更有效的方式來做到這一點,那麼首先它會以不同的順序開始。

編輯:自從你編輯以來,你的問題與我初步認爲的不同。您似乎擔心,當您刪除具有最高ID的行時,新行將獲得相同的ID。那是因爲你讓整件事情變得比需要的複雜。

第1步:改變你的數據庫

設置你的new_id列是INT AUTO_INCREMENT PRIMARY KEY如本SQL Fiddle

第2步:更改您的代碼(也修復了SQL注入的問題與你的原碼)

if(isset($submit)){ 

    if($pav2 == ""){ 
     header('Location: index.php'); 
    } 
    else { 
     $query2 = mysql_query("INSERT INTO naujiena (new_id,new_pav) VALUES (0,'". mysql_real_escape_string($pav2)."')"); 

     header('Location: index.php'); 
    } 

    } 
} 
+0

$ select2 = mysql_query(」SELECT new_id from naujiena ORDER BY new_id DESC LIMIT 1 「); \t \t如果(mysql_num_rows($ SELECT2)> 0){ \t \t \t $ max_public_id =和mysql_fetch_row(SELECT2 $); \t \t \t $ QUERY2 =請求mysql_query(」 INSERT INTO naujiena(NEW_ID,new_pav)VALUES( 「$最大_public_id [0] '+ 1,' $ pav2' )「); \t \t}我的代碼是。 – user2149578 2013-03-10 12:19:09

+0

@ user2149578該代碼比需要的更復雜。只需將new_id列更改爲「AUTO_INCREMENT」,然後插入一個「0」 - 無需事先選擇。數據庫將自動選擇一個新的ID。 – Hazzit 2013-03-10 12:23:43

+0

問題仍然存在:( – user2149578 2013-03-10 12:31:39