重置列ID

时间:2013-12-11 20:14:28

标签: php mysql database

我目前有一个类似下面的数据库:

1 citrus
2 pear
4 apple
5 melon
8 mango

这些数字代表一个包含行号的列,但由于行经常被删除,因此它们经常被搞砸。使用PHP中的MySQL查询可以重新计算这些行,以便它们再次有意义吗?

3 个答案:

答案 0 :(得分:1)

您永远不应该在关系数据库中重新安排ID。至少不是要将它们用作外键。 (我打赌他们会这样,否则这个ID有什么意义?)

你的水果表:1 =>柑橘,2 =>梨,4 =>苹果,5 =>甜瓜,8 =>芒果

考虑使用另一张表,颜色,保持1 =>红色,2 =>黄色,3 =>绿色。

现在考虑让表 fruit_color 保持1 => 2,2 => 3,4 => 3,5 => 2,8 => 1。

如果我要重新安排你的水果桌会发生什么呢?......这种关系会搞砸。

答案 1 :(得分:0)

与每行相关联的ID为primary key,并且每次插入时通常为auto_increment d。此ID用作每行的唯一标识,以便可以使用查询来选择它,而且可以单独使用。

当你删除数据时,行将按照从最低id到最高id的顺序排列,最高id是插入的最后一行。

数据库存在间隙是正常的,但您也可以手动分配ID,只要知道数据库中尚不存在该ID。

如果要按特定顺序保存数据,可以为每个对象分配索引,表示其排名,并在查询中使用order by命令。

SELECT id, fruit, rank FROM fruits ORDER BY rank ASC;

答案 2 :(得分:0)

你要做的是(A)复杂的代码,以及(B)更新的噩梦,这意味着(C)可能性很好,它会搞砸你的数据库。正如nl-x所暗示的那样,最好的办法是保留PRIMARY KEYs。但是,如果你想拥有一个设置ID,我会建议你在用PHP拉它时分配它。

function get_fruits() {
    //SQL query
    $query = ...
    //SQL result
    $i = 0;
    while($row = $query->fetch_assoc()) {
        $rows[$i] = $row;
    }

    return $rows;
 }

现在,当你循环遍历行时,你将能够将每个数组键视为排名,而最终用户将更加明智,同时保持数据库的完整性不受限制。

**按订单提取数据** 如果由于某种原因您需要能够按记录号而不是ID,您还可以使用以下查询从下表中获取第5条记录。

ID | fruit_name
----------------
1  | Apple
2  | Banana
4  | Kiwi
7  | Coconut
9  | Strawberry

PHP中的查询:

$sql = "SELECT fruit_name FROM fruit_table LIMIT $i,1"

这将拉动$ i + 1记录。意思是如果你想获得第一条记录,$ i = 0。这是执行大多数for循环的方式,默认情况下MySQL自动递增将从1开始。

相关问题