sql >> Databasteknik >  >> RDS >> Mysql

MySQL dumpa i CSV-textfiler med kolumnnamn överst?

Jag kom på ett sätt att behöva ange dessa namn manuellt så länge du kör MySQL 5 eller högre. Här är det skrivet som ett bash-skript för att köras på en unix-kommandorad:

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

Även om det inte är den mest graciösa lösningen, är jag säker på att den kan komprimeras till en enda rad av någon som kan SQL och/eller bash lite bättre än jag...

Vad den gör är:

  1. använder MySQL:s informationsschema för att skapa en tom CSV med kolumnrubriker
  2. lägger till en extra rad i den tomma CSV-filen så att din data börjar visas på en ny rad
  3. använder en ganska vanlig "SELECT * INTO OUTFILE..."-fråga för att skapa en CSV full med data
  4. lägger till datafilen i filen med kolumnrubriker
  5. tar bort den (tillfälliga) datafilen

Lycka till, och om du städar upp det, posta dina resultat!



  1. Hur lägger jag till egenskapen identitet till en befintlig kolumn i SQL Server

  2. mysql Det gick inte att läsa automatiskt inkrementvärde från lagringsmotorn

  3. Skapa en Excel-fil (.xlsx) med PL/SQL

  4. MySQL använder inte index med WHERE IN-klausul?