一、前言
最近做项目由于到一个问题,有个客户提出一个需求,需要将两个数据库中的两个表的数据合并,本以为是很简单的事情,于是就非常爽快的答应客户一天内给他弄好,哪知道其中遇到很多问题,于是写下这片文章记录下来,防止重蹈覆辙。
二、MySql 导出表中数据,不导出表结构。
通过查询分析器只能导出结构或者结果和数据,不能只导出数据,因此,只能通过mysqldump来操作:
命令如下:
mysqldump -h localhost -uroot -p123456 --skip-extended-insert --complete-insert mysql help_topic -t -c > C:\\Users\\chenxi\\Desktop\\sql\\123.sql
#mysql导出insert带字段的sql脚本数据
#mysqldump -u用户名 -p密码 -h数据库主机ip -P端口号 --skip-extended-insert --complete-insert 数据库名 表名 -t -c --where="条件">~/test.sql
--skip-extended-insert 一行一行的导出
-t 不会产生create table建表和drop table语句
-c 产生完整的insert语句(区别字段)
--where 拼接条件,只导出符合条件的数据
如下图:
但是:
如果表中,存在主键,会发现再次导入时,mysql会产生主键重复错误。因为通过mysqldump 只能导出一个表的所有字段,不能导出部分列的数据。因此,这种方式只能适用于没存主键的表。
三、通过mysql 命令格式化select 导出文件
方法一行不通,就使用方法二,通过mysql 执行查询语句,将指定列数据导出,命令如下:
>mysql -uroot -p123456 mysql -e "SELECT name, help_category_id, description, example, url FROM help_topic INTO OUTFILE 'C:\\Users\\chenxi\\Desktop\\sql\\123.sql' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n'";
在mysql 5.5 中会报如下错误:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
出现错误的原因是:
这个原因其实很简单,是因为在安装MySQL的时候限制了导入与导出的目录权限,只能在规定的目录下才能导入,
因此,在windows 上,mysql 需要查看my.ini 文件对于secure-file-priv 当前的值是什么,即导出目录在哪里。
查看了一下,发现5.5 中没有secure-file-priv 这个字段,因此,需要在my.ini文件末尾增加以下语句,后重启mysql。
secure_file_priv=''
在Windows 重启mysql 方法如下:
1.以"管理员"方式,运行cmd;
2.启动:输入 net stop mysql
3.停止:输入 net start mysql
提示* Redhat Linux 也支持service command,启动:# service mysqld start 停止:# service mysqld stop 重启:# service mysqld restart
* Windows下不能直接重启(restart),只能先停止,再启动。
如下图:
再次执行上面的命令,成功。
四、从文件导入到数据库,执行如下命令。
mysql -uroot -p123456 -Dmysql -e "LOAD DATA INFILE 'C:\\Users\\chenxi\\Desktop\\sql\\123.sql' INTO TABLE help_topic FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' (name, help_category_id, description, example, url)";
完毕.....
参考文章:
mysql5.7导出数据提示--secure-file-priv选项问题的解决方法