MYSQL:表更改后结果集会发生什么


MYSQL: What happens to a result set after the table is changed?

我正在编写的脚本的一部分要求我确切地知道结果集是如何从MYSQL查询中获取信息的。

我有一个SQL查询的标准结果,然后使用fetch_array生成一个行数组。

在循环浏览这些内容时,假设我从表中删除了一行。如果我将结果的指针重置回第一个,我会在该行不存在的情况下再次找到它吗?会找到一个空行吗?还是会完全错过该行?

换句话说,结果是根据需要向MYSQL询问每一行,还是一次性获得整个数组,这样之后就不会对表进行任何更改?

提前欢呼

编辑

$result = $conn->query("SELECT ID, value FROM table");
while($row=$result->fetch_array()){
  if(x){
    $conn->query("DELETE FROM table WHERE ID=$row['ID']");
    mysqli_data_seek($result,0);
  }
}

问题是,被删除的行会在重置后重复、被跳过或返回其他内容(如NULL)吗?

否,它不会删除初始提取结果集中的那一行。

但它当然会删除当前表中的行。

如果尝试重置指针,则该行的初始结果集仍然存在。除非你用另一个覆盖它。

考虑这个例子。假设你的桌子里有这个:

+----+--------+
| id | value  |
+----+--------+
| 1  | test1  |
| 2  | test2  |
| 5  | test5  |
+----+--------+

如果你进行这种操作:

$result = $conn->query('SELECT id, value FROM mytable'); // sample query
while($row = $result->fetch_assoc()) { // fetch all results
    if($row['id'] == 5) { // some condition
        $conn->query('DELETE FROM mytable WHERE id = 5'); // delete one row in table
    }
}
$result->data_seek(0); // reset the pointer
while($row = $result->fetch_assoc()) { // fetch the same result set
    echo $row['id'] . '<br/>';
}

它将删除中的特定行,但不会删除初始结果中的行。

在初始加载时,它将显示:

1
2
5

如果刷新它,现在5将消失,因为它是一个新的请求和另一个调用的结果集。