2016-09-21 3 views
0

Хорошо, я думал, что смогу понять это сам, но я просто не вижу его. Цель для меня, чтобы заполнить таблицу MODELOS в следующим образом:SET в LOAD DATA INFILE

+--------+----------+---------+ 
| ID_MOD | ID_MARCA | MODELO | 
+--------+----------+---------+ 
|  1 |  1 | C2  | 
|  2 |  1 | C3  | 
|  3 |  1 | C4  | 
|  4 |  1 | PICASSA | 
|  5 |  2 | MONDEO | 
|  6 |  2 | S-MAX | 
|  7 |  3 | ACCORD | 
|  8 |  3 | CIVIC | 
|  9 |  4 | CLS  | 
|  10 |  5 | 900  | 
|  11 |  6 | IBIZA | 
|  12 |  6 | LEON | 
|  13 |  7 | 307  | 
|  14 |  7 | 308  | 
|  15 |  7 | 407  | 
|  16 |  7 | 408  | 
|  17 |  8 | MEGANE | 
|  18 |  9 | GOLF | 
|  19 |  9 | PASSAT | 
|  20 |  9 | TOUAREG | 
+--------+----------+---------+ 

Я получил эту таблицу:

mysql> select * from MARCAS; 
+----------+------------+ 
| ID_MARCA | MARCA  | 
+----------+------------+ 
|  1 | CITROEN | 
|  2 | FORD  | 
|  3 | HONDA  | 
|  4 | MERCEDES | 
|  7 | PEUGEOT | 
|  8 | RENAULT | 
|  5 | SAAB  | 
|  6 | SEAT  | 
|  9 | VOLKSWAGEN | 
+----------+------------+ 

и следующий файл для работы с:

"MARCA"#"MODELO"#"MATRICULA"#PRECIO 
"CITROEN"#"PICASSA"#"CPG-2044"#12000 
"CITROEN"#"PICASSA"#"CPR-1762"#12500 
"CITROEN"#"C4"#"FPP-1464"#13500 
"CITROEN"#"C4"#"FDR-4563"#13000 
"CITROEN"#"C3"#"BDF-8856"#8000 
"CITROEN"#"C3"#"BPZ-7878"#7500 
"CITROEN"#"C2"#"CDR-1515"#5000 
"CITROEN"#"C2"#"BCC-3434"#4500 
"FORD"#"MONDEO"#"BTG-3267"#8000 
"FORD"#"MONDEO"#"BPP-6792"#8200 
"FORD"#"S-MAX"#"FDR-1564"#20000 
"FORD"#"S-MAX"#"FCE-9327"#21000 
"HONDA"#"CIVIC"#"FCC-7764"#16000 
"HONDA"#"CIVIC"#"FBC-4567"#14000 
"HONDA"#"ACCORD"#"FFC-6768"#22000 
"HONDA"#"ACCORD"#"FPB-2231"#23000 
"MERCEDES"#"CLS"#"FDR-2265"#31000 
"SAAB"#"900"#"FPG-1165"#21000 
"SEAT"#"LEON"#"DVB-1119"#14500 
"SEAT"#"LEON"#"DCR-5634"#13500 
"SEAT"#"IBIZA"#"DPR-3434"#9500 
"SEAT"#"IBIZA"#"DPP-8756"#10000 
"PEUGEOT"#"307"#"DGX-4598"#5500 

и т.д.

Теперь, что я достиг:

mysql> select * from MODELOS; 
+--------+----------+---------+ 
| ID_MOD | ID_MARCA | MODELO | 
+--------+----------+---------+ 
|  1 |  NULL | MODELO | 
|  2 |  NULL | PICASSA | 
|  3 |  NULL | C4  | 
|  4 |  NULL | C3  | 
|  5 |  NULL | C2  | 
|  6 |  NULL | MONDEO | 
|  7 |  NULL | S-MAX | 
|  8 |  NULL | CIVIC | 
|  9 |  NULL | ACCORD | 
|  10 |  NULL | CLS  | 
|  11 |  NULL | 900  | 
|  12 |  NULL | LEON | 
|  13 |  NULL | IBIZA | 
|  14 |  NULL | 307  | 
|  15 |  NULL | 308  | 
|  16 |  NULL | 407  | 
|  17 |  NULL | 408  | 
|  18 |  NULL | MEGANE | 
|  19 |  NULL | PASSAT | 
|  20 |  NULL | GOLF | 
|  21 |  NULL | TOUAREG | 
+--------+----------+---------+ 

Используя эти команды:

ALTER TABLE MODELOS ADD UNIQUE(MODELO); 
LOAD DATA LOCAL INFILE myfile.txt 
IGNORE INTO TABLE MODELOS 
FIELDS TERMINATED BY '#' ENCLOSED BY '"' 
LINES ENDED BY '\n' 
IGNORE 1 LINES 
(@ignore1, MODELO, @ignore2, @ignore3); 

Как я могу получить, что для создания желаемых результатов? Я подозреваю, что самый простой способ сделать это будет с помощью предложения SET в LOAD DATA INFILE, но я просто не знаю, как это сделать?

+0

Предлагаю сделать это за два шага. Сначала загрузите в 'MODELOS', как вы написали, затем используйте' UPDATE MODELOS JOIN MARCAS', чтобы объединиться в поля 'ID_MARCA'. – Barmar

+0

Я думал об этом. Но не уверен, что с моим наставником полетит 2 шага. Однако стоит признать, что если что-то еще не получится. – CNB

ответ

0

Вы можете поместить запрос в предложение SET.

LOAD DATA LOCAL INFILE myfile.txt 
IGNORE INTO TABLE MODELOS 
FIELDS TERMINATED BY '#' ENCLOSED BY '"' 
LINES ENDED BY '\n' 
IGNORE 1 LINES 
(@marca, modelo, @ignore2, @ignore3) 
SET ID_MARCA = (SELECT ID_MARCA FROM MARCAS WHERE MARCA = @marca) 

Это использует первый столбец в файле, чтобы найти соответствующий идентификатор в таблице MARCAS.

+0

Это дает мне точно такой же результат, как и раньше. Не могли бы вы немного рассказать о том, как работает это предложение SET? Может быть, есть простое изменение, которое я могу сделать, и все это изменит? Спасибо за ваш вклад. Это ужасно. – CNB

+0

Я неправильно прочитал файл, я не понял отношения между файлом и таблицей «MARCAS». Попробуйте новый, который использует пользовательскую переменную '@ marca' для первого столбца файла. – Barmar

+0

Я попробовал это раньше (наряду с несколькими другими комбинациями), и он не загружает данные в столбец ID_MARCA (мне нужно понять, почему). Я отказался от этого (пока все равно) и просто собираюсь сделать это через временную таблицу. Еще раз спасибо за ваш вклад. – CNB