批量重命名PHP中的所有行


MySQL - Batch rename all rows in PHP

所以在这段代码中,我只是从表中删除了一行,所以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无序,你就会明白为什么你可能不应该这样做。

你的表确实需要主键。这加快了搜索/索引的速度,并使它们变得有用。查询数据库标准格式以获得有关推理的详细讨论。