首页 > 解决方案 > 如何从按公共列排序的数据库中导出所有表?

问题描述

我想将每个表从数据库导出到一个单独的 csv 文件,该文件由一个 commom 列排序到所有表。我正在使用 MySql、phpMyAdmin 和 Windows 10

我是 MySql 的新手,在 Stackoverflow 上搜索我可以得到这个将一个表导出到 csv 文件的代码,这正是我想要的:

SELECT * INTO OUTFILE 'c://path/name_of_table.csv'
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '' 
LINES TERMINATED BY '\n' 
FROM `name_of_table` ORDER BY name_of_column;

我可以在上面的查询中使用表名作为变量来遍历特定数据库中的所有表吗?

就像是:

FOREACH my_table IN my_database

    SELECT * INTO OUTFILE 'c://path/' .my_table.table_name. '.csv'
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '' 
    LINES TERMINATED BY '\n' 
    FROM `my_table.table_name` ORDER BY name_of_column;

END FOREACH;

任何其他方法也很受欢迎

谢谢!

标签: mysqlphpmyadminexport-to-csvinformation-schema

解决方案


你已经完成了一半。

一种解决方案是使用带有游标的存储过程来获取表名和一些动态 SQL 来生成 SELECT INTO OUTFILE 语句。

像这样的东西应该工作。

DELIMITER //

DROP PROCEDURE IF EXISTS db_export_csv //
CREATE PROCEDURE db_export_csv(_path VARCHAR(255), _sname VARCHAR(64))
BEGIN
  DECLARE tname VARCHAR(64);
  DECLARE done BOOLEAN DEFAULT FALSE;

  DECLARE cur CURSOR FOR 
    SELECT `table_name`
    FROM `information_schema`.`tables`
    WHERE `table_schema` = _sname
    AND `table_type` = 'BASE TABLE';

  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
  OPEN cur;

  myloop: LOOP
    FETCH cur INTO tname;
    IF done THEN 
      LEAVE myloop; 
    END IF;

    SET @sql = CONCAT("SELECT * INTO OUTFILE \'" , _path , '' , tname , '_' , CURRENT_DATE , ".csv\' ",
      "FIELDS TERMINATED BY ',' ", 
      "OPTIONALLY ENCLOSED BY '''' ",
      "LINES TERMINATED BY '\n' ", 
      "FROM `" , _sname , "`.`" , tname , "` ORDER BY `yrcolname` ASC");

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

  END LOOP; 

END //

DELIMITER ;

CALL db_export_csv('/var/lib/mysql-files/', 'test');

显然,我已经在 Linux 上对其进行了测试,因此您可以将自己的可写路径放入(允许设置 @@global.secure_file_priv)并且您应该更改yrcolname为适当的值。


推荐阅读