Можно ли использовать команду типа LOAD DATA INFILE для UPDATE строк в БД? - PullRequest
7 голосов
/ 02 октября 2009

Псевдостол:

 | 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 ]

7 голосов
/ 02 октября 2009

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

5 голосов
/ 02 октября 2009

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

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

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

...