2013-02-12 13 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序列中的空洞。