我目前有一个类似下面的数据库:
1 citrus
2 pear
4 apple
5 melon
8 mango
这些数字代表一个包含行号的列,但由于行经常被删除,因此它们经常被搞砸。使用PHP中的MySQL查询可以重新计算这些行,以便它们再次有意义吗?
答案 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开始。