2012-07-09 49 views
0

我的标题可能有点偏离,但我不确定如何解释它。在MySQL中删除删除时的唯一ID

我目前正在研究一个照片组合,用户可以从 上传图片。完成后,会发生以下情况:

图像通过HTML形式 - > PHP上传。 一个SQL记录创建持以下资料:

ID (Autoincrement) - Image title - Image Desc - Filepath 

用户还能够通过在Web界面另一个页面来管理自己上传。 发生这种情况时,SQL记录与文件一起被删除。但是,当 用户然后添加一个新文件时,将使用下一个ID号,从而使数据库留下一个空的空间,其中被删除的记录曾经是。

经过一番Google搜索后,我明白这是因为自动增量不能用于显示给用户的ID,而是用于其他目的。然而,因为我ftmb使用这些信息在图像查看器中显示照片编号,我想要一个更合适的方法。我需要的实质上是一个包含ints的MySQL列,它将填补删除记录时创建的空白。例如:

1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 

当删除记录5,我需要的ID,以填充间隙所以我代替

1 - 2 - 3 - 4 - - 6 - 7 - 8 

获取 1 - 2 - 3 - 4 - 5 - 6 - 7

有什么建议吗?

感谢您的帮助。 :-)

+2

这听起来像一个*显示问题*,与数据库真的没什么关系。你能不能简单地在输出图像时对图像进行编号,而不管它们在数据库中的ID如何? – deceze 2012-07-09 12:41:05

回答

2

MySQL没有一个好的工具来自动做到这一点,但你可以像做手工:

SELECT sequence_number FROM photo WHERE photo_id = 729; -- This would be 5. 
DELETE FROM photo WHERE photo_id=729; 
UPDATE photo SET sequence_number = sequence_number - 1 WHERE sequence_number > 5; 

UPDATE查询可以包括任何其他的条件(例如,匹配album_id)将描述其数目意味着连续的图片集。

但是,话虽如此,如果你只是总是向用户显示一个序列号,为什么它需要存储在数据库中呢?当您的PHP代码迭代结果时,只需在其中添加数字即可。

$sequence_number = 1; 
while ($row = mysql_fetch_assoc($results)) { 
    // ... Display everything ... 
    $sequence_number++; 
} 
+0

如果我理解正确,那是正确的方法。(确保你有'idvariable'的地方使用参数化查询,或者至少使用'mysql_real_escape_string'来确保你没有直接向查询中注入'_ _GET'参数。)我使用的'729'和当然,'5'在任何情况下都必然是变量,因为你显然不会每次都删除同一张照片。 – VoteyDisciple 2012-07-09 13:07:17

0

尝试:

SET @count = 0; 
UPDATE `<table>` SET `<table>`.`<column>` = @count:= @count + 1; 

上面将循环查询和办理的每一行,并用连续的整数更新<column>领域。

这应该回答你的问题,但我的理解你的问题与图像查看器可能是完全不同的东西,并不涉及到自动增量问题。

+1

这将修改实际的'PRIMARY KEY' /'AUTO_INCREMENT',这是非常不鼓励的。这里的问题是如何修改专门用于此目的的单独列。 – VoteyDisciple 2012-07-09 12:46:08

+0

正如我所描述的:这正是我试图避免的,以及任何ALTER建议。不过谢谢你的建议! – 2012-07-09 13:04:59