2012-01-23 87 views
-1

我有一個表格,其中包含一個用於排序行的自動增量ID。我做了一個表單,您可以更改行的順序。自動增量訂購

ID    
1 - 排個
2 - b行
3 - C行
4 - 行d

但主鍵(自動遞增)不允許雙打,如下所示:

ID    
1 - 排個
2 - b行
2 - C行
4 - 行d

有一種方法使用的是MySQL改變順序或PHP sript這樣我就可以重新排列順序:

ID     項目
1 - 排個
2 - b行
3 - 行d
4 - 列C

    在上述行d和c的實例
  • 已經改變,例如。 c行已經移動了1,d已經移動了1。

    任何幫助,將不勝感激!

UPDATE

的行是動態的。如果說,項目C被刪除計數是1,2,4,你會如何做,他們把差距縮小,如果刪除了某些

+2

Protip:不要使用id字段來排序行。 – JJJ

+1

@SebastianOpperman,使用另一個領域的座標。您可以使用允許空值的INT類型字段。 – Lobo

回答

4

添加順序領域,利用它來進行排序

ID項爲了

1 - 項的 - 1

2 - b項 - 2

3 - 項目C - 4

4 - 項d - 3

SELECT * FROM table ORDER BY order

+0

感謝您的回答,這些行是動態的。如果刪除了項目c,則計數將爲1,2,4。如果刪除了一些項目,您將如何縮小差距 – SebastianOpperman

+3

@SebastianOpperman不需要填補空白。訂單保持不變。 –

+0

如果你真的想「縮小差距」,我建議不要在數據庫中這樣做,而應該在PHP中進行,例如,通過使用kso​​rt() – dtech

0

你的表的ID字段用以除了唯一標識它記錄中沒有任何功能。如果你想訪問記錄號碼3,那麼記錄號碼3應該總是相同的記錄。如果刪除記錄編號3,然後有人試圖檢索它,它應該返回記錄編號3不再存在的事實,而不是其他記錄的編號爲3的其他記錄。

您需要記住,自動增量主鍵僅用於識別目的,並且不會在數據中提供其他語義目的。除了檢索特定的記錄並確保所有記錄在某些方面是唯一的,它們可以安全地忽略。

如果您想要的數據需要按特定順序排列,則可以使用ORDER BY指定要排序的列。如果沒有任何列提供足夠的數據進行排序,則可以考慮添加一個「排序」列,該列中包含項目應該位於結果集中的訂單值,然後是ORDER BY該列。

-2

如果你想關閉間隙,不要讓Id字段自動增量,當插入一個新行時,從表中獲取最大的id條目並將1加1,那樣刪除一些時就不會有間隙之間的行。

+1

這違反了ID的整個點,因爲相同的ID可能在不同的時間引用不同的記錄。 – GordonM