Пакетная вставка в MySQL с подробной информацией о запросе
Сегодня мы поговорим о пакетной вставке данных в MySQL-таблице. Конечно, многие уже давно знакомы с такой возможностью при работе с множеством данных. Выполняя подобные запросы мы существенно экономим ресурсы. А иногда бывает проще выполнить множество одиночных вставок в базу данных. Но, это уже другая история.
Допустим у нас есть некоторая таблица с данными. Вот пример ее заполнения (создать таблицу сможете самостоятельно).
INSERT INTO Colors (`name`, `color`) VALUES ('Gold', '#FFD700'), ('Yellow', '#FFFF00'), ('Violet', '#EE82EE'), ('Tan', '#D2B48C') ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `color` = VALUES(`color`)
Таким несложным запросом мы вставляем данные в таблицу, а если они уже существуют, то обновляются (при условии изменения в них). Довольно удобный запрос, который либо вставляет, либо обновляет записи. Но тут возникает вопрос, а как же получить информацию о количестве вставленных или обновленных записей?
Получение дополнительной информации о запросе.
Для извлечения информации о запросе воспользуемся полезной функцией mysqli_info(mysqli $link). Более подробно прочитать о функции можно здесь. Внизу среди комментариев есть интересный пример для работы с ней. Вот именно таким примером мы и воспользуемся при написании нашей собственной функции (но более удобной).
Сразу выкладываю листинг моей функции.
/** * Извлекает информацию о последнем выполненном запросе * @param mysqli $db * @return array|null */ protected function getMysqlInfo(mysqli $db): ?array { if ($mysqlInfo = mysqli_info($db)) { list($records, $duplicates, $warnings) = sscanf($mysqlInfo, "Records: %d Duplicates: %d Warnings: %d"); return [ 'inserts' => $inserts = $db->rows_affected - ($duplicates * 2), 'updates' => $updates = ($db->rows_affected - $inserts)/2, 'skipped' => $records - ($inserts + $updates), 'total' => $records, ]; } return null; }
С помощью такой простой манипуляции получаем полезную функцию, которая возвращает информацию о количестве вставленных, обновленных или пропущенных записей.
Спасибо за внимание и до новых встреч.