Можно ли использовать команду типа LOAD DATA INFILE для ОБНОВЛЕНИЯ строк в БД?

Псевдо таблица:

 | primary_key | first_name | last_name | date_of_birth |
 | 1           | John Smith |           | 07/04/1982    |

На данный момент first_name содержит полное имя пользователя для многих строк. Желаемый результат - разделить данные, поэтому first_name содержит "John", а last_name содержит "Smith".

У меня есть файл CSV, который содержит желаемый формат данных:

 | primary_key | first_name | last_name |
 | 1           | John       | Smith     |

Есть ли способ использовать команду LOAD DATA INFILE для обработки файла CSV, чтобы ОБНОВИТЬ все строки в этой таблице с использованием primary_key - и не заменять какие-либо другие данные в строке во время процесса (например, date_of_birth)?

2 ответа

Решение

Нет. Хотя LOAD DATA INFILE имеет параметр REPLACE, он фактически заменит соответствующую строку, то есть удалит существующую и вставит новую.

Если вы сконфигурируете LOAD DATA INFILE так, чтобы вставлять только определенные столбцы, всем остальным будут установлены значения по умолчанию, а не значения, которые они содержат в настоящее время.

Можете ли вы изменить свой CSV-файл, чтобы вместо этого он содержал кучу операторов UPDATE? Должно быть достаточно простым с помощью некоторых регулярных выражений замен.

В этой ситуации я обычно LOAD DATA INFILE на временную таблицу с идентичной структурой. Тогда я делаю INSERT с ON DUPLICATE KEY UPDATE от временной таблицы к реальной таблице. Это позволяет проверять тип данных без разрушения вашей реальной таблицы; это относительно быстро и не требует возиться с вашим файлом.csv.

Другие вопросы по тегам