Безопасно ли изменять данные между вызовами fetchArray? - PullRequest
0 голосов
/ 12 мая 2018

Мне нужно выполнить поиск и заменить столбец (MY_COL) в таблице (MY_TABLE). Предположим, что MY_COL закодировано и не может быть изменено с помощью REPLACE или UPDATE SET.

Безопасно ли изменять строки между вызовами fetchArray, как в примере ниже?

$stmt = $db->prepare('SELECT ID, MY_COL FROM MY_TABLE');
$res = $stmt->execute();

while($row = $res->fetchArray(SQLITE3_ASSOC)) {
    $new_col = $row['MY_COL'];
    //modify new_col after decoding then re-encode it

    $stmt2 = $db->prepare('UPDATE MY_TABLE SET MY_COL=:new_col WHERE ID=:id');
    $stmt2->bindParam(':new_col', $new_col);
    $stmt2->bindParam(':id', $row['ID']);
    $stmt2->execute();
}

1 Ответ

0 голосов
/ 12 мая 2018

SQLite вычисляет результирующие строки по требованию, поэтому в зависимости от того, как происходит сканирование таблиц, курсор чтения может потерять свою точную позицию в таблице и пропустить какую-либо строку или прочитать ее дважды.

Вы можете прочитать все значения в списке перед выполнением обновлений.

В качестве альтернативы, зарегистрировать пользовательскую функцию , чтобы вы могли обновить все строки сразу:

$db->exec('UPDATE MyTable SET MyCol = MyFunction(MyCol)');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...