Можно иметь смешанный перезаписи / добавить пакетную запись в MySQL?
-
08-10-2019 - |
Вопрос
Я устанавливаю загрузку (используя PHP) для моего клиента, где они могут выбрать CSV (в заранее определенном формате) на их машине для загрузки. CSV, скорее всего, будет иметь 4000-5000 строк. PHP будет обработать файл, прочитав каждую строку CSV и вставляю его непосредственно в таблицу БД. Эта часть легко.
Однако, в идеале, прежде чем добавить эти данные в таблицу базы данных, я хотел бы просмотреть 3 столбца (A, B и C) и проверять, если у меня есть соответствующий комбинацию этих 3 полей в таблице, а если Поэтому я предпочел бы обновить этот ряд, а не добавлять. Если у меня нет совпадающего комбината этих 3 столбцов, я хочу пойти вперед и вставить строку, добавление данных в таблицу.
Моя первая мысль состоит в том, что я мог сделать столбцы A, B и C уникальный индекс в моем столе, а затем просто вставить каждую строку, обнаружил «неудачную» вставку (из-за ограничения моего уникального индекса) как-то, а затем сделать обновление Отказ Похоже, что этот метод может быть более эффективным, чем на необходимость сделать отдельный выбор запроса для каждой строки, чтобы увидеть, есть ли у меня сопоставление комбо уже в моем столе.
Третий подход может быть просто добавить все, используя NO MySQL уникальный индекс, а затем захватываю только новейшую уникальную комбо, когда клиент позже запросит этот стол. Однако я пытаюсь избежать тонны бесполезных данных в этом столе.
Мысли о лучших практиках или умных подходах?
Решение
Если вы делаете 3 столбца уникальным идентификатором, вы можете сделать вставку с дублирующим ключом.
INSERT INTO table (a,b,c,d,e,f) VALUES (1,2,3,5,6,7)
ON DUPLICATE KEY UPDATE d=5,e=6,f=7;
Вы можете прочитать больше об этой удобной технике здесь, в Mysql Manual..
Другие советы
Если вы добавите уникальный индекс на столбцах (A, B, C), вы можете использовать ЗАМЕНЯТЬ Для этого в одном утверждении:
Заменить работает точно так же, как вставка, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для первичного ключа или уникальный индекс, старая строка удаляется до того, как вставлен новый ряд ...