mysql表中的数据操作
表中有两列的条目不正确。表的大小可以容纳数十亿条记录。我想在两列(c1和C2)之间交换数据 所采取的方法是将小块数据导出到CSV文件中,然后使用更正的条目将其导入。例如,下面是数据集mysql表中的数据操作,mysql,shell,csv,stored-procedures,infobright,Mysql,Shell,Csv,Stored Procedures,Infobright,表中有两列的条目不正确。表的大小可以容纳数十亿条记录。我想在两列(c1和C2)之间交换数据 所采取的方法是将小块数据导出到CSV文件中,然后使用更正的条目将其导入。例如,下面是数据集 -------- |C1 | C2 | |3 | 4 | |4 | 6 | 然后,我将数据导出到一个分号为delimted的CSV文件(未显示完整命令),如下所示 这种命令的输出将是 4;3 6;4 当我导入回数据时(删除有问题的数据后),数据将被更正如下 | C1 C2 | | 3 4
--------
|C1 | C2 |
|3 | 4 |
|4 | 6 |
然后,我将数据导出到一个分号为delimted的CSV文件(未显示完整命令),如下所示
这种命令的输出将是
4;3
6;4
当我导入回数据时(删除有问题的数据后),数据将被更正如下
| C1 C2 |
| 3 4 |
| 4 6 |
我相信这真的是一个外置和填充操作的问题
问题:
CREATE DEFINER=`root`@`%` PROCEDURE `change_fields`(IN `tableName` VARCHAR(200))
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SET @hr1 = CONCAT('Delete from temp_table;');
PREPARE hrStmt1 FROM @hr1;
EXECUTE hrStmt1;
DEALLOCATE PREPARE hrStmt1;
SET @hr1 = CONCAT('insert into temp_table (C_1, C_2) Select C2, C1 from `',tableName,'`;');
PREPARE hrStmt1 FROM @hr1;
EXECUTE hrStmt1;
DEALLOCATE PREPARE hrStmt1;
SET @hr1 = CONCAT('Delete from `',tableName,'`;');
PREPARE hrStmt1 FROM @hr1;
EXECUTE hrStmt1;
DEALLOCATE PREPARE hrStmt1;
SET @hr1 = CONCAT('insert into `',tableName,'` (C1,C2) select C_1, C_2 from temp_table;');
PREPARE hrStmt1 FROM @hr1;
EXECUTE hrStmt1;
DEALLOCATE PREPARE hrStmt1;
END;
1) 这是一个非常广泛的问题,答案可能主要基于观点。2) 这是毫无疑问的。3) 存储过程中不允许加载数据填充。4) 同样,这是一个过于宽泛的问题。不太可能有人会从头开始给你写剧本。5) 同样,这里没有问题6)这与1)基本相同,因此,我不太清楚您在这里期望的答案是什么。只需使用数据库中的新表将数据复制到。转换完所有数据后,删除原始表并将新表重命名为原始表
CREATE DEFINER=`root`@`%` PROCEDURE `change_fields`(IN `tableName` VARCHAR(200))
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
SET @hr1 = CONCAT('Delete from temp_table;');
PREPARE hrStmt1 FROM @hr1;
EXECUTE hrStmt1;
DEALLOCATE PREPARE hrStmt1;
SET @hr1 = CONCAT('insert into temp_table (C_1, C_2) Select C2, C1 from `',tableName,'`;');
PREPARE hrStmt1 FROM @hr1;
EXECUTE hrStmt1;
DEALLOCATE PREPARE hrStmt1;
SET @hr1 = CONCAT('Delete from `',tableName,'`;');
PREPARE hrStmt1 FROM @hr1;
EXECUTE hrStmt1;
DEALLOCATE PREPARE hrStmt1;
SET @hr1 = CONCAT('insert into `',tableName,'` (C1,C2) select C_1, C_2 from temp_table;');
PREPARE hrStmt1 FROM @hr1;
EXECUTE hrStmt1;
DEALLOCATE PREPARE hrStmt1;
END;