Как экспортировать все таблицы из базы данных, упорядоченные по общему столбцу?

Я хочу экспортировать каждую таблицу из базы данных в отдельный 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;

Любой другой подход также приветствуется

Спасибо!


person Goblin    schedule 27.07.2018    source источник
comment
вы можете сделать дамп базы данных sql, если затем вы собираетесь перезагрузить все в новую базу данных   -  person Lelio Faieta    schedule 27.07.2018


Ответы (1)


Вы были на полпути.

Одним из решений может быть использование хранимой процедуры с курсором для получения имен таблиц и некоторого динамического 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 на соответствующее значение.

person Paul Campbell    schedule 27.07.2018