2013-02-12 14 views
1

當我刪除數據庫中的行時,ID(auto_ increment)現在更長以串行。假設我有1 2 3 4 5 6 7 8 9,並刪除了行3 4 5。刪除後,我想讓ID出現爲1 2 3 4 5 6而不是1 2 6 7 8 9如何在刪除行時始終在mysql中序列化id行

請問我該怎麼做?

UPDATE

我使用此代碼顯示的序列號從數據庫中生成的評論...(內while循環)

 <?php 
      $serial = 0; 
      $serial++; 
      echo"<div class='commentserial'> 
        <div id='$serial'></div> 
        <a href='#$serial'>$serial</a> 
        </diV>"; 
     ?> 

現在,我有一個分頁腳本在評論顯示上,當我點擊第二頁而不是序列號從1開始到$ per_page Number時。

所以我覺得如果我使用數據庫ID,那麼編號將不會從1開始在後續分頁頁面上。

+0

是id主鍵? – 2013-02-12 12:49:16

+4

記錄(主鍵)的Id應該永不改變。你爲什麼需要這種行爲? – Spontifixus 2013-02-12 12:50:28

+0

@Spontifixus請參閱更新 – user1843335 2013-02-12 13:00:24

回答

2

你想做什麼不會是好的做法。主鍵上的孔應該不會留在那裏。想象一下,例如在你的主表中在另一個表中有ID 25的引用。如果主表中的內容發生變化,引用會突然指向不同的記錄。

這同樣適用於網絡鏈接。擁有一個像

details.html?id=255 

一個URL突然指向不同的記錄將非常糟糕。

如果你想要一個完美的序列號,你最好在應用程序級創建它。

+2

如果您刪除記錄,則應該使引用無效(SET NULL)或刪除操作應該級聯(CASCADE),或者應該在那裏限制delect(NO ACTION, RESTRICTED),但不應該有記錄指向不(更長)現有的記錄。只要設置你的限制,這個問題就不會發生。但當然,修改主鍵是一個不好的做法。 – 2013-02-12 12:54:14

+0

請參閱更新 – user1843335 2013-02-12 13:01:11

1

使用:SELECT * FROM TABLE_NAME LIMIT偏移,ROW_COUNT

例如:

if(isset($_GET['page'])) $page=$_GET['page']; 
else      $page=1; 

$row_count=10;  

$offset=($page-1)*$row_count; 
$sql="select * from table1 limit $offset,$row_count"; 
0

自動增量的目的僅在合成鍵被使用。這些鍵沒有任何語義含義,因此它們是否按順序排列並不重要。

如果您的ID列具有語義含義,您應該給它一個有意義的名稱並且不要使用自動增量(如果需要,可以考慮使用自動增量創建新的合成鍵)。

要實現分頁,您可以使用它的數據庫查詢。考慮mysql關鍵字LIMITOFFSET。這樣,您的代碼生成鏈接就不必擔心ID序列中的空洞。