2012-07-08 117 views
1

我使用auto-increment爲我的數據庫中的每個新條目分配一個id。 另外,我有一個php腳本,根據當前頁碼從這個數據庫中選擇10個entrys。 例如,如果當前頁面爲2,則腳本應選擇id = 20和id = 29之間的每個條目。mysql自動增量 - 記錄刪除後重新分配

現在,如果我刪除一個條目,該ID將丟失。因此,當id28被刪除時,腳本將只顯示9個信息。

e記錄被刪除後,有沒有辦法重新分配auto-increment的值?

+1

是不是有沒有使用LIMIT子句中的「偏移量」的原因? 'LIMIT 0,10',next page'LIMIT 10,10',next page'LIMIT 20,10',... – rodneyrehm 2012-07-08 11:47:12

+0

我從來沒有聽說過這個。我應該更好地研究了整個sql的東西: 非常感謝,這非常棒。 – Sprottenwels 2012-07-08 11:53:15

回答

6

這通常被認爲是可取的:如果條目編號28被刪除,也不會再像一個條目28。如果有人曾經試圖引用它,那麼他們顯然試圖引用已被刪除的那個,並且您可以報告錯誤。

如果你回去,並重新分配28一些新的項目,現在你不知道的人是否意味着28紀錄。

讓我們退一步,重新審視您想要做的事情。您的目標不是顯示2030之間的10個條目。你的目標是顯示10個符合你的標準的條目。對於這一點,你可以使用內置的LIMITOFFSET方面:

SELECT ... 
FROM ... 
WHERE ... 
OFFSET 29 
LIMIT 10 

OFFSET告訴MySQL從哪裏開始計數和LIMIT告訴它如何不計其數。 MySQL將整個結果集放在一起,然後從第30個開始給你10個條目。這是你的第四頁結果。現在它並不重要,它們碰巧擁有什麼ID。

+0

不可能有更清楚的,謝謝:) – Sprottenwels 2012-07-08 11:58:09

3

您應該改變選擇頁面條目的方式。

通過使用LIMIT .. OFFSET子句,你就可以選擇10個條目,開始第N個條目:

SELECT * 
FROM  table 
ORDER BY id 
LIMIT 10 
OFFSET 19 
  • LIMIT 10意味着回報只有10行
  • OFFSET 19意味着在第19行後返回行

這樣,它如果某個ID已被刪除且ID不連續,則無關緊要。

只要改變OFFSET:

  • 1 => 0 OFFSET
  • 頁2 => OFFSET 9
  • 頁3 => OFFSET 19
  • 頁N => OFFSET(N- 1)* 10-1
+1

這應該是'LIMIT 0,10',因爲這是一個基於零的偏移量? – rodneyrehm 2012-07-08 11:54:09

+0

你說得對,固定 – arnaud576875 2012-07-08 11:55:27

1

你的問題建議像

SELECT columns FROM table WHERE id BETWEEN 20 AND 29; 

以下優雅

SELECT columns FROM table WHERE id >= 20 AND id <= 29; 

查詢如果是的話,我建議你在LIMIT clause閱讀並沿

SELECT columns FROM table ORDER BY id LIMIT 20, 10; 
線做somethong
1

你可以,但你不應該。如果id = 29存在,您將自動增量重置爲28,那麼自動增量要使用id = 29但該記錄已存在時會出現問題。

你會更好寫像這樣的查詢:

select * from table order by ID LIMIT n,10; 

其中n是* 10

1

重新分配自動增量值這是不好的做法,因爲ID,可以在使用的頁面數與其他表格的關係。忘了關於重新分配自動增量:)

2

作爲對您的問題(auto_increment)的直接回答,您可以使用以下查詢更改其值:

ALTER TABLE `your_table` AUTO_INCREMENT = 200 

下一個創建的項目將其下一個AI柱值設置爲200.這在某些情況下很有用,但我同意你最好使用LIMIT偏移。