所以在这段代码中,我只是从表中删除了一行,所以img_pos的值是:1、2、3、4、5所示现在,它们是(假设我们删除了第三个条目):1、2、4、5当然,我希望这是:1、2、3、4
所以我必须批量重命名行
我得到了这个,但似乎不工作....
$sql = "SELECT * FROM $tableImg WHERE img_acc = $accid ORDER BY img_pos";
$res = mysql_query($sql);
$num = mysql_num_rows($res);
$i = 0;
$n = 1;
while($i<$num){
$sql = "SELECT * FROM $tableImg WHERE img_acc = $accid ORDER BY img_pos DESC LIMIT $i,1";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$img_pos = $row['img_pos'];
$sql = "UPDATE $tableImg SET img_pos = '$n' WHERE img_acc = '$accid' AND img_pos = '$img_pos'";
$res = mysql_query($sql);
$i++;
$n++;
}
mysql_close();
$tableImg只是一个包含表名的变量,这很好。我猜问题是在"$img_pos = $row['img_pos'];"附近,因为所有的查询都在不同的地方使用,即使略有不同,他们应该工作…
提前感谢!
最后我简单地这样做了:
$i = 1;
while($row = mysql_fetch_array($res)){
$old_pos = $row['img_pos'];
$sql = "UPDATE $tableImg SET img_pos = $i WHERE img_acc = $accid AND img_pos = $old_pos";
$res = mysql_query($sql);
$i++;
};
这是完全可能的,只是完全没有必要。数字数据的好处是你不需要看它,所以如果它有点漏洞也没关系,不是吗?
如果你真的想这样做(比如,你正在构建一个应用程序,你只是在清理你在工作时删除的东西),下面的例子将在SQL中做,如这个简单的例子所示:
CREATE TABLE disorder (id int,stuff CHAR(6));
CREATE TABLE disorder2 (id SERIAL,stuff CHAR(6));
INSERT INTO disorder (id,stuff)
VALUES
('1','ONE'),
('2','TWO'),
('3','THREE'),
('4','FOUR'),
('5','FIVE');
DELETE FROM disorder WHERE id='3';
INSERT INTO disorder2 (stuff) SELECT stuff FROM disorder;
TRUNCATE TABLE disorder;
INSERT INTO disorder SELECT * from disorder2;
DROP TABLE disorder2;
这可以在sqlfiddle上看到,但是非常明显。如果你执行了SELECT * from无序,你就会明白为什么你可能不应该这样做。
你的表确实需要主键。这加快了搜索/索引的速度,并使它们变得有用。查询数据库标准格式以获得有关推理的详细讨论。