2013-12-11 28 views
-1

我現在有一個數據庫,它看起來很像下面的一個:重置列ID的

1 citrus 
2 pear 
4 apple 
5 melon 
8 mango 

的數字代表持有的行號列,但因爲行通常刪除它們會經常搞砸。用PHP中的MySQL查詢可以重新計算這些行,以便它們再次有意義嗎?

+7

這些ID用於關聯數據。有空隙等是可以的。 – AbraCadaver

+0

你是什麼意思?*'一列保存行號'*?數字是一個持有id的字段,還是他們實際上只是指示該行被輸出的順序? –

+0

這是一個美學問題,只要色譜柱自動增量,空位就不相關。 – Mihai

回答

0

與每一行關聯的ID是primary key,並且在每個插入上通常是auto_increment'd。此ID用作每行的唯一標識,以便可以使用查詢來選擇它,並單獨使用它。

在刪除數據時,行將按照從最低的ID到最高的ID的順序排列,最高的ID是插入的最後一行。

數據庫存在間隙是正常現象,但您也可以手動分配標識,但您應該知道該標識尚不存在於數據庫中。

如果您希望按特定順序保存數據,則可以爲每個對象分配一個索引,以表示其級別,並在查詢中使用order by命令。

SELECT id, fruit, rank FROM fruits ORDER BY rank ASC; 
1

您不應該在關係數據庫中重新安排ID。至少不要將它們用作外鍵。 (我敢打賭,他們會是這樣,否則那是什麼ID的感覺?)

水果表:1 =>柑橘,2 =>梨,4 =>蘋果,5 =>瓜,8 =>芒果

考慮有另一個表,顏色保持1 =>紅色,2 =>黃色,3 =>綠色。

現在考慮擁有一張表fruit_color保持1 => 2,2 => 3,4 => 3,5 => 2 = 8 => 1。

現在如果我只是重新排列水果桌會發生什麼?......關係會變得混亂。

0

你所要做的將是(A)複雜的代碼,和(B)的噩夢更新,這意味着(C),賠率是不錯的它會搞砸了你的數據庫。正如nl-x所建議的那樣,最好的辦法就是保留原來的主鍵。然而,如果你想擁有一組ID,我建議你在使用PHP進行分配時進行分配。現在

function get_fruits() { 
    //SQL query 
    $query = ... 
    //SQL result 
    $i = 0; 
    while($row = $query->fetch_assoc()) { 
     $rows[$i] = $row; 
    } 

    return $rows; 
} 

當你通過你的行週期,你就可以將每個數組鍵作爲軍銜,而終端用戶將是毫無收穫,同時還能保持你的數據庫的完整性及格。

**按訂單提取數據** 如果由於某種原因您需要能夠通過記錄號碼而不是ID拉動,您還可以通過以下查詢獲得下表中的第5條記錄。

ID | fruit_name 
---------------- 
1 | Apple 
2 | Banana 
4 | Kiwi 
7 | Coconut 
9 | Strawberry 

查詢在PHP中:

$sql = "SELECT fruit_name FROM fruit_table LIMIT $i,1" 

這將拉動$ I + 1的紀錄。意思是如果你想得到第一條記錄,$ i = 0。這是執行大多數for循環的方式,默認情況下MySQL自動增量將從1開始。