Mysql ‘LOAD DATA LOCAL INFILE’ specifică valoarea coloanei în funcție de fișier (Programare, Java, Mysql, Încarcă Datele În Fișier)

pro_newbie a intrebat.

Sunt blocat într-o situație în care trebuie să citesc date din 3 fișiere CSV mari separate și să le stochez în baza de date MySQL.

coloane din fișierul csv:

total_rev,monthly_rev,day_rev

Coloanele tabelei din baza de date: Tabel de date::

total_rev, monthly_rev, day_rev, from

Pot să introduc date în tabelul meu folosind următoarea interogare:

LOAD DATA LOCAL INFILE '/home/datauser/Desktop/working/revenue_2016_10_06.csv'  
INTO TABLE revenue_table  
FIELDS TERMINATED BY ','   
LINES TERMINATED BY '
'  
(total_rev,monthly_rev,day_rev);

Dar sunt blocat într-o situație în care vreau să adaug un parametru codificat în interogarea „Load Data Local” pentru a adăuga dinîn funcție de fișier.

astfel încât la sfârșitul tabelului meu să conțină înregistrări de tipul:

total_rev, monthly_rev, day_rev,  from
  11,       222,          333,    file1
  22,        32,          343,    file1
  11,        22,          333,    file1
  11,        22,           33,    file22
  11,        22,           33,    file22

Cum pot specifica aceste valori file1, file22 în interogarea de mai sus?

1 răspunsuri
spencer7593

Adăugați un SET clauză la instrucțiunea LOAD DATA, pentru a atribui o valoare la (din păcate numită) from coloană:

 LOAD DATA LOCAL INFILE '/home/datauser/Desktop/working/revenue_2016_10_06.csv'  
 INTO TABLE revenue_table  
 FIELDS TERMINATED BY ','   
 LINES TERMINATED BY '
'  
 (total_rev,monthly_rev,day_rev)

 SET `from` = 'file1'
 ;

Rețineți că este de asemenea posibil să încărcați câmpurile din fișier în variabile definite de utilizator și/sau să faceți referire la variabilele definite de utilizator în clauza SET.

 SET @file_name = 'myfilename'
 ;

 LOAD DATA LOCAL INFILE '/home/datauser/Desktop/working/revenue_2016_10_06.csv'  
 INTO TABLE revenue_table  
 FIELDS TERMINATED BY ','   
 LINES TERMINATED BY '
'  
 ( @total_rev
 , @monthly_rev
 , @day_rev
 )
 SET `total_rev`   = @total_rev
   , `monthly_rev` = @monthly_rev
   , `day_rev`     = @day_rev
   , `from`        = @file_name
 ;

Dacă aveam câmpuri în fișier pe care dorim să le sărim, nu să le încărcăm în tabel, putem folosi o variabilă definită de utilizator ca un spațiu de rezervă. De asemenea, putem folosi expresii în clauza SET, ceea ce ne permite să folosim unele funcții MySQL foarte utile pentru anumite manipulări… IFNULL, NULLIF, STR_TO_DATE, CONCAT, etc.

Comentarii

  • Este posibil să se utilizeze LOAD DATA LOCAL INFILE @file_name sintaxa? –  > Por hriziya.
  • @hriziya: nu cred că aceasta este o utilizare validă a unei variabile definite de utilizator; o udv poate furniza o a a valoare într-o instrucțiune SQL; o udv nu poate furniza n identificator (cum ar fi un nume de tabel sau un nume de coloană) sau un cuvânt cheie (cum ar fi FROM sau ASC). Am putea să încercăm și să vedem ce face MySQL dacă folosim o variabilă definită de utilizator în locul locației fișierului. (Bănuiesc că vom primi o eroare, dar poate că va funcționa).  > Por spencer7593.
  • Mulțumesc, Da, am încercat asta deja și am primit o eroare când am încercat să furnizez variabila ca nume de fișier –  > Por hriziya.