Uploading several rows of data from a text, csv, and excel file into a MySQL table is a routine task for sysadmins and DBAs who are managing MySQL database. This article explains 4 practical examples on how to import data from a file to MySQL table using both mysqlimport and “load data local infile” method. Instead of importing data, if you want to backup and restore MySQL database, please use mysqldump or mysqlhotcopy.
Create an employee table and employee.txt datafile
For the examples mentioned in this article, let us create a very simple employee table with three columns–employee number, employee name and job.
# mysql -u root -ptmppassword mysql> use test Database changed mysql> create table employee -> ( -> empno int, -> ename varchar(15), -> job varchar(10) -> ); Query OK, 0 rows affected (0.01 sec)
Create a test datafile employee.txt with fields delimited by tab as shown below.
# cat employee.txt 100 John Doe DBA 200 John Smith Sysadmin 300 Raj Patel Developer
1. Upload tab delimited datafile to MySQL table
Use mysqlimport to import the employee.txt datafile to employee table in test database, as shown below:
# mysqlimport -u root -ptmppassword --local test employee.txt test.employee: Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
Verify that the records got uploaded successfully.
# mysql -u root -ptmppassword mysql> use test; mysql> select * from employee; +-------+------------+-----------+ | empno | ename | job | +-------+------------+-----------+ | 100 | John Doe | DBA | | 200 | John Smith | Sysadmin | | 300 | Raj Patel | Developer | +-------+------------+-----------+ 3 rows in set (0.00 sec)
Note: In mysqlimport, the name of the datafile should match the name of the table. The extension of the datafile can be anything. In the above example, only employee.* datafile can be used to upload data to employee table. You’ll get the following error message when the filename is not same as tablename:
# mysqlimport -u root -ptmppassword --local test emp.txt
mysqlimport: Error: Table 'test.emp' doesn't exist, when using table: emp
[Note: The table name is employee. So, datafile name should be employee.*]
2. Import multiple datafiles into multiple MySQL tables
The following example uploads data from two different datafiles to two different tables. i.e It uploads employee.txt to employee table and manager.txt to manager table.
# mysqlimport -u root -ptmppassword --local test employee.txt manager.txt
3. Use LOAD DATA LOCAL INFILE to upload data to MySQL tables
The mysqlimport client is simply a command-line interface to the LOAD DATA LOCAL INFILE SQL statement. Most options to mysqlimport correspond directly to clauses of “load data local infile” syntax. You can perfrom the same upload explained in example#1 using “load data local infile” instead of mysqlimport as explained below:
# mysql -u root -ptmppassword mysql> use test; mysql> LOAD DATA LOCAL INFILE '/home/ramesh/employee.txt' -> INTO TABLE employee -> FIELDS TERMINATED BY '\t' -> LINES TERMINATED BY '\n' -> (empno, ename, job); Query OK, 3 rows affected (0.01 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 mysql> select * from employee; +-------+------------+-----------+ | empno | ename | job | +-------+------------+-----------+ | 100 | John Doe | DBA | | 200 | John Smith | Sysadmin | | 300 | Raj Patel | Developer | +-------+------------+-----------+ 3 rows in set (0.00 sec)
4. Most frequently used mysqlimport options
The most frequently used mysqlimport options are shown in the example below. Most of these options are self explanatory.
- compress: Compress all information sent between the client and the server
- delete: This option is very handy when you want to empty the table before importing the text file
- local: Read input files locally from the client host
- lock-tables: Lock all tables for writing before processing any text files. This ensures that all tables are synchronized on the server.
# mysqlimport \ --user=root \ --password=tmppassword \ --columns=empno,ename,job \ --compress \ --delete \ --fields-optionally-enclosed-by='"' \ --fields-terminated-by='\t' \ --fields-escaped-by='' \ --lines-terminated-by='\n' \ --local \ --lock-tables \ --verbose \ test employee.txt
Output of the above mysqlimport command:
Connecting to localhost Selecting database test Locking tables for write Deleting the old data from table employee Loading data from LOCAL file: /home/ramesh/employee.txt into employee test.employee: Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 Disconnecting from localhost
Comments on this entry are closed.
@Ramesh,
One thing that never worked with me while using my Wordpress MySQL DB is that, if I take a data backup from my live database and restore it on my home wordpress setup (for experiments) it never works – ie. I can’t even restore though both are running some versions of MySQL as well as Wordpress…
After a couple of trials (and reinstall of WP) I gave up… I need to figure out why this error comes… in fact, for a long time now I am not having the exact replica of my live blog at my home PC.
Cheers,
Ajith
it nice
thanks
Ajith, because the build is different (versions have build numbers).
Ch33rs !
Hi, nice! thanks for the post.
I think “-ptmppassword” should read “-p tmppassword”
Hi Ramesh,
Many thanks. I was struggling with mysqlimport but your example clarified.
Thanks again.
Anony,
“-ptmppassword” is correct. If you place a space after the “-p” it will ask prompt you for a password.
i have multiple files in single folder i want load all files into single destination table, if u know the task plz inform.
I ran this code:
mysql> LOAD DATA LOCAL INFILE ‘Treat.txt’
-> INTO TABLE TREAT
-> FIELDS TERMINATED BY ‘\t’
-> LINES TERMINATED BY ‘\n’
-> (Patient_ID, MD_ID, Exam_ID);
Query OK, 0 rows affected, 216 warnings (0.07 sec)
Records: 216 Deleted: 0 Skipped: 216 Warnings: 216
What’s the issue? Please help.