基于CentOS的MySQL学习补充四–使用Shell批量从CSV文件中插入数据到数据表

最后更新于:2022-04-01 09:56:41

[本文出处:http://blog.csdn.net/u012377333/article/details/47022699](http://blog.csdn.net/u012377333/article/details/47022699) 从上面的几篇文章中,可以知道如何[使用Shell创建数据库](http://blog.csdn.net/u012377333/article/details/47001007),[使用Shell创建数据表](http://blog.csdn.net/u012377333/article/details/47006087),本文继续介绍Shell结合MySQL的使用--如何使用Shell批量插入数据? 这里涉及一点MySQL其他的知识,[如何导入或者导出数据?](http://blog.csdn.net/u012377333/article/details/47022469) 首先做这些之前,需要按照上面所介绍的创建好数据库和数据库表,然后就是将要查询到数据库中的数据写到CSV文件中,由于个人比较懒,选择从一个现成的数据库中导出一部分数据用于测试。 创建了一个名字叫做[t_prov_city_area_street](http://download.csdn.net/detail/u012377333/8926341)的数据表,关于如何创建这个表可以去我的资源里面下载创建该表的sql脚本,该脚本的名字是[t_prov_city_area_street.sql](http://download.csdn.net/detail/u012377333/8926341)。然后就是使用上面介绍的方法,导出关于所有省的信息,导出方法如下: ~~~ <span style="font-family:Microsoft YaHei;font-size:14px;">SELECT * FROM t_prov_city_area_street WHERE level=3 INTO OUTFILE '/tmp/prov_csv' FIELDS TERMINATED BY ',';</span> ~~~ 我们就会得到一个保存着所有省级信息的CSV文件[prov.csv](http://download.csdn.net/detail/u012377333/8926341),同样可以在资源里面找到这个文件。 接下来就是重点部分了Shell脚本批量插入数据: ~~~ #!/bin/sh #Author: chisj #Date: 2015.7.23 #Describe Insert Data TO Table 'sct_Province' #The username of mysql database USER="root" #The password of mysql database PASS="dragonwake" #The datebase name will be created DATABASE="SmartCare" TABLE="sct_Province" TABLE_DATA="prov.csv" if [ -f ${TABLE_DATA} ]; then echo "File ${TABLE_DATA} Existed." else echo "File ${TABLE_DATA} Not Existed." echo exit 2 fi while read line; do query=`echo $line | awk -F, '{printf("\"%s\", \"%s\", \"%s\", \"%s\"", $2, $3, $4, $5)}'` statement=`echo "insert into ${TABLE}(ProvinceCode, ParentID, ProvinceName, Level) values($query)"` echo $statement mysql -u $USER -p$PASS $DATABASE << EOF > /dev/null insert into ${TABLE}(ProvinceCode, ParentID, ProvinceName, Level) values($query); EOF done < $TABLE_DATA if [ $? -eq 0 ]; then echo "Insert Data Into $TABLE Success." fi ~~~ 执行shell脚本的时候的截图,可以参考一下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-17_56ea5d8cd0f1b.jpg) 插入完成之后,查询结果的截图: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-17_56ea5d8d0175d.jpg) 由于我希望主键ProvinceID是自增长的,不想使用csv里面的数据,所有脚本里面有一点点的改变,就是 ~~~ query=`echo $line | awk -F, '{printf("\"%s\", \"%s\", \"%s\", \"%s\"", $2, $3, $4, $5)}'` statement=`echo "insert into ${TABLE}(ProvinceCode, ParentID, ProvinceName, Level) values($query)"` ~~~ 和 ~~~ query=`echo $line | awk -F, '{printf("\"%s\", \"%s\", \"%s\", \"%s\", \"%s\"", $1, $2, $3, $4, $5)}'` statement=`echo "insert into ${TABLE} values($query)"` ~~~ 以及 ~~~ insert into ${TABLE}(ProvinceCode, ParentID, ProvinceName, Level) values($query);</span> ~~~ 和 ~~~ insert into ${TABLE} values($query); ~~~ 替换就可以了。 在验证数据是否插入成功的时候,会发现有乱码,我在创建数据的时候有设置为utf8格式,为什么还会这样的,后来我重启了mysqld服务就可以正常看到中文了。 ### 所有的脚本和CSV文件:[Shell脚本批量添加CSV数据到MySQL](http://download.csdn.net/detail/u012377333/8926341)
';