Mysql - pobieranie i wysyłanie danych do pliku

2010-05-02 , Papiewski Łukasz , Tips & Tricks / Tipy

Miałem sytuację gdy chciałem wyeksportować dane z bazy do pliku, lub importować dane z innego pliku tekstowego do specyficznej kolumny.

Dokumentacja potrzebnych komend

LOAD DATA

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE NUMBER LINES]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...]

SELECT

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | POSITION}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | POSITION}
      [ASC | DESC], ...]
    [LIMIT {[offset,] ROW_COUNT | ROW_COUNT OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

Eksportujemy cały wiersz z bazy

Przydatne gdy chcemy zrobić kopię zapasową, lub edytować w pliku.
SELECT * FROM Content WHERE shortTitle='mainframe-glossary'  INTO OUTFILE '/tmp/mainframe-glossary' LINES TERMINATED BY '\r\n';
lub
mysql poomla -e "SELECT * FROM Content WHERE shortTitle='mainframe-glossary'  INTO OUTFILE '/tmp/mainframe-glossary' LINES TERMINATED BY '\r\n';"

Dodatkowo dodałem aby nowe linie były zakończone linuxowym znakiem końca linii. Nie wiem jak jest pod windowsem, możliwe że '\r\r'. Gdy tego nie dodamy u mnie baza wypluła jakieś backslashe na końcu linii. Kodowanie eksportowane jest zgodnie z kodowaniem tabeli.

Format wyjściowy domyślny rozdziela każdą kolumnę znakiem tabulacji '\t'.

Importujemy wiersz do bazy

Przed importem trzeba usunąć stary wiersz, inaczej będziemy mieć ERROR 1062 (23000): Duplicate entry '109' for key 'id'.
LOAD DATA INFILE '/tmp/a' INTO TABLE Content CHARACTER SET utf8 LINES TERMINATED BY '\r\n';

Należy koniecznie podać kodowanie oraz sposób rozdzielania nowych linijek.

Cytaty

- Simplicity is the ultimate sophistication. - Leonardo da Vinci,
- Popularny człowiek wzbudza zawiść potężnych - Thufir Hawat o Leto Atrydzie (na Kaladanie),
- Szczęście następuje po smutku, a smutek po szczęściu; człowiek jest naprawdę wolny, gdy przestaje rozróżniać między smutkiem a szczęściem, między dobrem a złem - Aforyzmy buddyjskie.