Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Загружаю в БД огромные таблицы из csv. Можно ли средствами mysql/eloquent отсекать повторяющиеся записи, если я для повышения производительности формирую и отправляю по одному запросу на 500 записей? Уникальность записей должна определяться по всем столбцам одновременно в рамках всего csv-документа или всей таблицы бд (каждый документ пишется в новую таблицу). Если в двух строках хоть в одном столбце строки (числа) отличаются, значит считаем, что записи уникальны и не повторяющиеся. Какой самый простой способ это сделать? array_unique($csv) не работает. Я из csv получаю тип данных, который не является массивом.
$csv = Reader::createFromPath("$path)->setHeaderOffset(0); // использую эту библиотеку: thephpleague/csv
foreach ($csv as $record) {
$dataSet[] = [
'table_column_1' => $record['col_1'];
...
...
];
}
DB::table($table)->insert($dataSet);
Я упростил этот фрагмент, чтобы не загромождать его лишним, убрал итерации по 500 записей и т.п.
Изменено Antuan (11.12.2017 23:09:59)
Не в сети
В MySQL есть ON DUPLICATE KEY конструкция (можно сделать первичный ключ составным, на все столбцы), но, сам Laravel не умеет работать с составными ключами.
Поэтому, может тебе подойдет такой вариант:
Создаем временную таблицу, где первичный ключ - составной.
Заполняем ее с инструкцией ON DUPLICATE KEY.
Переносим все уникальные записи в "нужную" таблицу.
Не в сети
Можно хэш создавать из столбцов, который будет первичным ключом.
Не в сети
Создаем временную таблицу, где первичный ключ - составной.
Кроме первичного ключа есть просто уникальные столбцы (UNIQUE), так что для работы ON DUPLICATE KEY ... UPDATE не нужно менять ПК.
Если хочется просто пропускать записи, которые вызывают ошибки из-за уникального ключа (или ПК), то достаточно добавить IGNORE в INSERT:
INSERT IGNORE INTO ...
А если нужно заменить повторы последней повторявшейся строкой - то REPLACE:
REPLACE INTO ...
У INSERT есть много полезных флагов, почитайте документацию.
Не в сети