Можно иметь смешанный перезаписи / добавить пакетную запись в MySQL?

StackOverflow https://stackoverflow.com/questions/4410368

  •  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), вы можете использовать ЗАМЕНЯТЬ Для этого в одном утверждении:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top