Load Data : 파일 내용 넣기

2024. 11. 20. 11:07MySQL/Class

반응형

# load data 를 이용하여, 파일 내용을 DB에 넣으려고 합니다.

 

(1) 파일 내용

원본 파일

 

(2) load data

- 구분자를 지정해주 않으면, 하나의 컬럼에 통채로 들어가게 됩니다.

MariaDB [test]> create table temp_1 (emp varchar(20));
Query OK, 0 rows affected (0.02 sec)

MariaDB [test]> load data local infile '/home/mysql/test.txt' into table temp_1;
Query OK, 5 rows affected (0.00 sec)                 
Records: 5  Deleted: 0  Skipped: 0  Warnings: 0

MariaDB [test]> select * from temp_1;
+-------------------+
| emp               |
+-------------------+
| 11111111,50,testa |
| 22222222,40,testb |
| 33333333,30,testc |
| 44444444,20,testd |
| 55555555,10,teste |
+-------------------+
5 rows in set (0.00 sec)

 

(3) fields terminated by

- 하지만 우리가 원하는 것은 각 컬럼별로 들어가게 하는게 목적이지 않겠습니까? 방법은 구분자만 알려주면 됩니다.

fields terminated by ','
MariaDB [test]> create table temp_2(emp varchar(10), dbno int, tableno varchar(10));
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> load data local infile '/home/mysql/test.txt' into table temp_2
    -> fields terminated by ',';
Query OK, 5 rows affected (0.01 sec)                 
Records: 5  Deleted: 0  Skipped: 0  Warnings: 0

MariaDB [test]> select * from temp_2;
+----------+------+---------+
| emp      | dbno | tableno |
+----------+------+---------+
| 11111111 |   50 | testa   |
| 22222222 |   40 | testb   |
| 33333333 |   30 | testc   |
| 44444444 |   20 | testd   |
| 55555555 |   10 | teste   |
+----------+------+---------+
5 rows in set (0.00 sec)

 

(4) lines terminated by

- lines terminated by 는 파일 내용에서 어디까지 한 로우인지 지정해주는 옵션입니다.

lines terminated by '\n'

 

# 예를 들어 원본 파일이 아래와 같습니다.

원본 파일

 

- '\n'이 없기 때문에 끝까지 파일 내용을 읽게 됩니다.

- 이렇게 되면 데이터를 구분자가 들어갈 만큼만 구분되어 컬럼에 들어가고 마지막 컬럼에는 모든 내용이 전부 넣어지게 됩니다.

MariaDB [test]> load data local infile '/home/mysql/test2.txt' into table temp_3
    -> fields terminated by ','
    -> lines terminated by '\n'
    -> (
    ->     @code1,
    ->     @code2,
    ->     @code3
    -> ) SET
    ->     `emp` = @code1,
    ->     `dbno` = @code2,
    ->     `tableno` = @code3
    -> ;
Query OK, 1 row affected, 1 warning (0.00 sec)       
Records: 1  Deleted: 0  Skipped: 0  Warnings: 1

MariaDB [test]> select * from temp_3;
+----------+------+----------------+
| emp      | dbno | tableno        |
+----------+------+----------------+
| 11111111 |   50 | testa;22222222 |
+----------+------+----------------+
1 row in set (0.00 sec)

 

- 구분자를 ';' 값을 끝으로 보았기에 ";"표시된 부분까지만 인식하고 DB에 넣어지게 됩니다.

MariaDB [test]> load data local infile '/home/mysql/test2.txt' into table temp_3
    -> fields terminated by ','
    -> lines terminated by ';'
    -> (
    ->     @code1,
    ->     @code2,
    ->     @code3
    -> ) SET
    ->     `emp` = @code1,
    ->     `dbno` = @code2,
    ->     `tableno` = @code3
    -> ;
Query OK, 5 rows affected (0.00 sec)                 
Records: 5  Deleted: 0  Skipped: 0  Warnings: 0

MariaDB [test]> select * from temp_3;
+----------+------+---------+
| emp      | dbno | tableno |
+----------+------+---------+
| 11111111 |   50 | testa   |
| 22222222 |   40 | testb   |
| 33333333 |   30 | testc   |
| 44444444 |   20 | testd   |
| 55555555 |   10 | teste
  |
+----------+------+---------+
5 rows in set (0.00 sec)

 * 마지막 로우가 왜 저렇게 변하는지 확인이 좀 필요해보입니다. ㅠㅠ

 

(5) Tip?

- 컬럼에 다른 값을 넣고 싶을때 이렇게 하는 것도 좋은 방법입니다.

load data local infile '/home/mysql/test2.txt' into table temp_3
fields terminated by ','
lines terminated by ';'
(
    @code1,
    @code2,
    @code3
) SET
    `emp` = @code2,
    `dbno` = @code3,
    `tableno` = @code1

 

반응형

'MySQL > Class' 카테고리의 다른 글

log-slave-updates  (0) 2024.11.18
M2(Mac)용 VMWare로 가상화 만들기 - (9) xtrabackup  (2) 2024.11.17
pt-table-checksum 사용  (4) 2024.11.16
M2(Mac)용 VMWare로 가상화 만들기 - (8) pt-toolkit 설치  (0) 2024.11.15
세션수 확인  (2) 2024.11.12