Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 11.12.2017 23:08:06

Как обеспечить уникальность записей при "пакетном" добавлении в БД?

Загружаю в БД огромные таблицы из 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)

Не в сети

#2 12.12.2017 00:21:40

Re: Как обеспечить уникальность записей при "пакетном" добавлении в БД?

В MySQL есть ON DUPLICATE KEY конструкция (можно сделать первичный ключ составным, на все столбцы), но, сам Laravel не умеет работать с составными ключами.
Поэтому, может тебе подойдет такой вариант:
Создаем временную таблицу, где первичный ключ - составной.
Заполняем ее с инструкцией ON DUPLICATE KEY.
Переносим все уникальные записи в "нужную" таблицу.

Не в сети

#3 12.12.2017 08:37:20

Re: Как обеспечить уникальность записей при "пакетном" добавлении в БД?

Можно хэш создавать из столбцов, который будет первичным ключом.

Не в сети

#4 12.12.2017 14:25:47

Re: Как обеспечить уникальность записей при "пакетном" добавлении в БД?

Создаем временную таблицу, где первичный ключ - составной.

Кроме первичного ключа есть просто уникальные столбцы (UNIQUE), так что для работы ON DUPLICATE KEY ... UPDATE не нужно менять ПК.

Если хочется просто пропускать записи, которые вызывают ошибки из-за уникального ключа (или ПК), то достаточно добавить IGNORE в INSERT:

INSERT IGNORE INTO ...

А если нужно заменить повторы последней повторявшейся строкой - то REPLACE:

REPLACE INTO ...

У INSERT есть много полезных флагов, почитайте документацию.

Не в сети

Подвал раздела