Очень большой update

185
13 декабря 2018, 10:30

У меня в базе хранится список файлов. На странице надо отображать их размер. Раньше это делалось динамически (через функцию filesize), сейчас это стало невозможно (файлы были вынесены на отдельный файловый сервер). Надо заносить размеры в базу. Я взял с помощью sql сформировал csv из id и путей. С помощью php распарсил, получил размеры и сформировал кучу bulk update вида update files set size = (case id when 123 then 321 end);. По 10к when/then внутри. Записей очень много... Вообщем когда все выполнилось я посмотрел логи этих апдейтов и заметил что в некоторых случаях проапдейтилось даже больше строк чем было в блоке, а в некоторых наоборот меньше. Как такое может быть не представляю.

Вот если интересно так я получил csv (у меня две таких таблицы):

select concat(id, ':', path) as line
from article_files;
select concat(id, ':', path) as line
from payment_files;

А таким php-шным скриптом я их обработал:

function file_get_lines($filename, $lineBreak = "\n") {
    return explode($lineBreak, file_get_contents($filename));
}
function computeFileSizes($table) {
    $input = array_map(function($line) {
        return explode(':', $line);
    }, file_get_lines("${table}_input.txt"));
    $output = [];
    foreach ($input as list($id, $filename)) {
        $size = filesize($filename) ?: 0;
        $output[] = "when $id then $size";
    }
    $sqlParts = [];
    foreach (array_chunk($output, 10000) as $outputParts) {
        $whenParts = implode("\n", $outputParts);
        $sqlParts[] = "update $table set size = (case id\n${whenParts}\nend);";
    }
    file_put_contents("${table}_output.txt", implode("\n", $sqlParts));
}
computeFileSizes('article_files');
computeFileSizes('payment_files');

В итоге проапдейтилось меньше половины! С чем это может быть связано? И вообще может есть более простой способ сделать это?

Answer 1

Вообщем я переделал скрипт и сформировал insert во временную таблицу вместо update существующей. Так что вставились все записи без потерь. А потом просто проапдейтил из нее уже.

READ ALSO
Query failed: ERROR: invalid input syntax for type json

Query failed: ERROR: invalid input syntax for type json

Почему-то возникает ошибка при вставке json в базу:

191
Шаблон для tuple

Шаблон для tuple

У меня есть нечто такое

196
Использование юникода в консоли

Использование юникода в консоли

Работаю MS VS 201, Win 7Следующий код выводит не тот символ, какой надо:

205
C++ WinApi Качество рисования

C++ WinApi Качество рисования

Если например рисовать круг на окне, то он получается нечетким, как рисовать/рендерить более точно неровные примитивы?

257