如何从按公共列排序的数据库中导出所有表?
How to export all tables from a database ordered by a common column?
我想将每个 table 从数据库导出到一个单独的 csv 文件,该文件由所有 table 的公共列排序。我正在使用 MySql、phpMyAdmin 和 Windows 10
我是 MySql 的新手,在 Whosebug 上搜索我可以得到这段代码,它可以将 table 导出到 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;
我可以在上面的查询中使用 table 名称作为变量来遍历来自特定数据库的所有 table 吗?
类似于:
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;
欢迎使用任何其他方法
谢谢!
你已经完成了一半。
一个解决方案是使用带有游标的存储过程来获取 table 名称和一些动态 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 上对其进行了测试,因此您可以将自己的 writable 路径放入(允许设置 @@global.secure_file_priv)并且您应该将 yrcolname
更改为适当的值。
我想将每个 table 从数据库导出到一个单独的 csv 文件,该文件由所有 table 的公共列排序。我正在使用 MySql、phpMyAdmin 和 Windows 10
我是 MySql 的新手,在 Whosebug 上搜索我可以得到这段代码,它可以将 table 导出到 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;
我可以在上面的查询中使用 table 名称作为变量来遍历来自特定数据库的所有 table 吗?
类似于:
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;
欢迎使用任何其他方法
谢谢!
你已经完成了一半。
一个解决方案是使用带有游标的存储过程来获取 table 名称和一些动态 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 上对其进行了测试,因此您可以将自己的 writable 路径放入(允许设置 @@global.secure_file_priv)并且您应该将 yrcolname
更改为适当的值。