2013-03-12 41 views
4

我正在創建一個網頁。該網頁根據用戶操作將數據存儲到MySQL數據庫中。數據庫有很多行。該行的主鍵是列的rowID,它只是按順序對行進行編號(例如,1,2,3,4 ....)。用戶可以選擇刪除行。問題是當用戶刪除最後一行以外的行時。 rowID中有一個跳過。例如,如果有5行,則爲1,2,3,4,5,並且用戶刪除第三行。現在rowID列中的數據是1,2,4,5。我想知道MySQL或PHP中是否已有內置函數來有效地進行計算。自動刪除主鍵序列中的空位

我知道擺脫這一點的唯一方法是遍歷行並基本刷新rowID。但是,如果有大量的行,我認爲這將是非常昂貴的時間。

我也想知道如何自動增加rowID,如果有新的行正在創建。目前我有代碼來查找當前最大的rowNumber,並插入當前最大的rowNumber + 1行。

回答

2

你不想這樣做。主鍵是唯一標識符,創建後決不能更改。你在找什麼是nested sets。添加一個字段以跟蹤left_id和right_id,並在必要時手動更新。 Doctrine2中有一些庫可以處理這個問題。

如果您絕對必須進行此更改,則可以使用alter table刪除該字段,然後重新添加它。

+0

因此,據我所知,解決方案將創建另一列相同的主鍵(但不是主鍵),並更新呢?你也可以詳細說明left_id和right_id解決方案,因爲我不確定我是否理解它。 – 2013-03-12 17:55:40

+1

PK永遠不會改變的是一個*觀點*。但是,SQL支持專門爲這個「問題」級聯,並且沒有什麼本質上可以改變的PK的錯誤 - 當然,爲了按照所描述的維護非間隙序列,改變PK可能存在問題由OP .. – 2013-03-12 17:55:45

+0

從你的例子中,如果第三項被刪除。第一行left_id = 0,right_id = 2 |第二行left_id = 1,right_id = 4 |第四行left_id = 2,right_id = 5 |第五行left_id = 4,right_id = null – mkaatman 2013-03-12 17:56:38

3

不,因爲它不重要。你不應該依賴於主鍵是一個連續的序列。它的唯一功能是確保密鑰是行的唯一標識符,除此之外,數字沒有意義。

+1

+1我會寫同樣的答案 - 也許更詳細 - 但最終它會說不超過這個。如果需要一個無間隙的序列,那通常可以作爲對選擇的視圖操作(或對其進行仿真) - 數據庫本身並不關心其他情況。 – 2013-03-12 17:58:38