13

可能重复:
如何将 MySql 表导出/转储到包含字段名称(又名标题或列名称)的文本文件中

我使用这个 SQL 片段将表转储到 CSV 文本文件中:

SELECT * FROM brand INTO OUTFILE "e:/brand.csv" FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "\n";

但是,这种方法不会在 CSV 文件的开头添加列名。我的问题是如何选择所有列/字段名称,就像导出表并选择“将字段名称放在第一行”时 phpMyAdmin 所做的一样。

4

2 回答 2

23

只要您运行的是 MySQL 5 或更高版本,我就找到了一种不必手动输入这些名称的方法。在这里,它被编写为一个 bash 脚本,用于在 unix 命令行上运行:

DBNAME=<database_name>
TABLE=<table_name>

FNAME=/path/to/output/dir/$(date +%Y.%m.%d)-$DBNAME.csv

#(1)creates empty file and sets up column names using the information_schema
mysql -u <username> -p<password> $DBNAME -B -e "SELECT COLUMN_NAME FROM information_schema.COLUMNS C WHERE table_name = '$TABLE';" | awk '{print $1}' | grep -iv ^COLUMN_NAME$ | sed 's/^/"/g;s/$/"/g' | tr '\n' ',' > $FNAME

#(2)appends newline to mark beginning of data vs. column titles
echo "" >> $FNAME

#(3)dumps data from DB into /var/mysql/tempfile.csv
mysql -u <username> -p<password> $DBNAME -B -e "SELECT * INTO OUTFILE '/var/mysql/tempfile.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' FROM $TABLE;"

#(4)merges data file and file w/ column names
cat /var/mysql/tempfile.csv >> $FNAME

#(5)deletes tempfile
rm -rf /var/mysql/tempfile.csv

虽然不是最优雅的解决方案,但我确信它可以被比我更了解 SQL 和/或 bash 的人压缩成一行......

它的作用是:

  1. 使用 MySQL 的信息模式创建一个带有列标题的空 CSV
  2. 向该空 CSV 附加一个额外的换行符,因此您的数据将开始出现一个新行
  3. 使用非常标准的“SELECT * INTO OUTFILE...”查询来创建一个充满数据的 CSV
  4. 将数据文件附加到带有列标题的文件上
  5. 删除(临时)数据文件

祝你好运,如果你清理它,发布你的结果!

于 2012-01-21T02:13:30.923 回答
7

我认为这可以满足您的要求。我正在使用 mysql 5.1.60,这会在第一行输出字段名称。这将使用“\t”作为字段分隔符,我不知道如何改为使用逗号。

echo "SELECT * FROM brand;" | mysql -uXXX -pXXX databasename > brand.tsv
于 2012-03-13T17:23:24.597 回答