Подтвердить что ты не робот

Экспорт таблицы MySQL в файл csv

У меня есть таблица MySQL, которую нужно вынуть как файл csv. Я использовал запрос

SELECT "ID","NAME","SALARY","SAL1","SAL2","SAL3","SAL4","SAL5","SAL6","SAL7","SAL8","SAL9","SAL10","SAL11","SAL12","SAL13","SAL14","SAL15","SAL16","SAL17","SAL18","SAL19","SAL20","SAL21","SAL22","SAL23","SAL24","SAL25","SAL26"
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n

Этот запрос работает, что, если у меня есть 200 имен столбцов? Есть ли способ сделать это, не набрав вручную?

4b9b3361

Ответ 1

Эта команда почти дает вам то, что вы хотите, и даже работает с удаленным сервером. Единственное предостережение в том, что он генерирует TSV файлы (поля разделяются вкладкой).

mysql mydb -e "select * from mytable" -B > mytable.tsv 

Но вы можете преобразовать его в CSV, используя sed, как предложено в этом ответе

mysql mydb -e "select * from mytable" -B | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable.csv

Ответ 2

DESCRIBE addstock25;

Разделите первый столбец и первую 3 записи этого столбца (в зависимости от вашего использования). Вы получите список полей в addstock25.

Это приведет к именам полей, использующим виртуальные таблицы, полученные в ядре... называемой информационной схемой.

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='foo';

Предположим, что имя этого запроса будет sq_fieldnamelist

Итак, таблица выше имеет один столбец и имеет имена полей таблицы "foo".

Если вы прямо пишете

    SELECT (sq_fieldnamelist)
    UNION ALL
    SELECT *
    FROM addstock25
    INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n

Mysql выдаст ошибку. "subquery возвращает несколько строк"

Мы должны отредактировать sq_fieldnamelist, чтобы выполнить все записи назад, разделенные запятыми.

Select GROUP_CONCAT(COLUMN_NAME)
FROM
(SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='ffd_companies'
LIMIT 3,100
) AS fafa
GROUP BY 'COLUMN_NAME' // this group by is just to make group concat work

Давайте скажем, что это sq_fieldnamelist2

Если мы отредактируем sq_fieldnamelist следующим образом. Он будет возвращать только одно значение, которое представляет собой все имена полей, разделенные запятыми. Итак, теперь мы можем поместить этот подзапрос в ваш оператор select для получения необходимых полей.

SELECT (sq_fieldnamelist2)
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n

Вам нужно отредактировать LIMIT 3,100 в sq_fieldnamelist2 для вашей собственной цели.

скажем, что ваша таблица подобна fil1, fil2... filN, sal1, sal2, sal3...., salI, чтобы увидеть только поля зарплаты, которые вы должны использовать LIMIT N,x>I+N. если вы хотите, чтобы все использовали LIMIT 0,x>N+I

Ответ 3

Я не вижу, почему вы не можете сделать

SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n

?

Ответ 4

Я думаю, вы ищете что-то вроде этого.

    SET @sql = NULL;
        SELECT GROUP_CONCAT("'",COLUMN_NAME,"'")
          FROM
        (SELECT `COLUMN_NAME`
        FROM `INFORMATION_SCHEMA`.`COLUMNS` 
        WHERE `TABLE_SCHEMA` = 'yourdatabasename'
        and `TABLE_NAME`='ffd_companies'
        ) AS colnames
        GROUP BY 'COLUMN_NAME' 
        into @sql;

        SET @sql = concat ("SELECT", @sql, " from dual
        UNION ALL
        SELECT *
        FROM addstock25
        INTO OUTFILE 'E:\\JOSE DATA\\addstock7.csv'
        FIELDS TERMINATED BY ','
        ENCLOSED BY '", '"',"'
        )"
        );

        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

Надеюсь, это поможет вам.

Примечание: я добавляю предложение WHERE TABLE_SCHEMA= 'yourdatabasename'