sql >> Databasteknik >  >> RDS >> Mysql

mysql + importera en fil med mellanslag i kolumnrubriken + hur man hanterar

MySQL LOAD DATA-satsen laddar värden från filen efter position , inte vid namn.

MySQL har inga krav på att "namnen" på fälten (från rubrikraden i .csv-filen) "matchar" några kolumnnamn. (Det är möjligt att någon annan komponent i ditt system har den typen av krav, men det gör inte MySQL LOAD DATA.)

Det är giltigt för en .csv-fil att inte ha en rubrikrad. När det finns en rubrikrad "hoppar vi över" den med IGNORE 1 LINES .

Till skillnad från det föredrar jag att använda nyckelordet FIELDS i LOAD DATA-satsen istället för COLUMNS .

I MySQL kan identifierare (kolumnnamn, tabellnamn) escapes med backtick-tecken. För att använda en identifierare som innehåller ogiltiga tecken, som ett mellanslag, måste identifieraren escapes.

CREATE TABLE ... 
... 
`Rec Open Date` DATE NOT NULL COMMENT 'Rec Open Date',
^             ^

På mitt tangentbord är backtick tangenten uppe till vänster ` ~ precis till vänster om 1 ! nyckel.

ANSI_QUOTES

Om sql_mode variabel inkluderar ANSI_QUOTES , då kan du också använda dubbla citattecken för att undvika identifierare. t.ex.

SHOW VARIABLES LIKE 'sql_mode' ;

SET sql_mode = 'ANSI_QUOTES,...' ;

SHOW VARIABLES LIKE 'sql_mode'

Variable_name  Value        
-------------  -----------
sql_mode       ANSI_QUOTES  

Sedan:

CREATE TABLE ... 
... 
"Rec Open Date" DATE NOT NULL COMMENT 'Rec Open Date',
^             ^

Om sql_mode gör inte inkludera ANSI_QUOTES (antingen uttryckligen eller inkluderat i någon annan inställning), då fungerar inte de dubbla citattecken kring identifierare. Och att använda enstaka citattecken runt identifierare borde aldrig fungera... enstaka citattecken omsluter bokstavliga strängar.

Takeaway:använd backtick-tecken för att undkomma identifierare (kolumnnamn, tabellnamn, etc.) och använd enstaka citattecken runt bokstavliga strängar. Undvik att använda dubbla citattecken runt bokstavliga strängar för att få din SQL-kod att fungera även när ANSI_QUOTES är inställt.




  1. Hur man byter namn på en databas i MySQL

  2. Är primärnyckel också index?

  3. Optimistisk samtidighet:IsConcurrencyToken och RowVersion

  4. Kvalificerar ett temporärt tabellkolumnnamn i jOOQ