Пакетная вставка в 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;
}

С помощью такой простой манипуляции получаем полезную функцию, которая возвращает информацию о количестве вставленных, обновленных или пропущенных записей.

Спасибо за внимание и до новых встреч.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: