Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql表中的数据操作_Mysql_Shell_Csv_Stored Procedures_Infobright - Fatal编程技术网

mysql表中的数据操作

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)之间交换数据 所采取的方法是将小块数据导出到CSV文件中,然后使用更正的条目将其导入。例如,下面是数据集

--------
|C1 | C2 |
|3  | 4  |
|4  | 6  |
然后,我将数据导出到一个分号为delimted的CSV文件(未显示完整命令),如下所示

这种命令的输出将是

4;3
6;4
当我导入回数据时(删除有问题的数据后),数据将被更正如下

  | C1  C2 |
  | 3   4  |
  | 4   6  |
我相信这真的是一个外置和填充操作的问题

问题:

  • 这种方法有意义吗?实际数据也需要NULL,int 除数据交换之外的某些列中的值
  • 另一个复杂性是在生产数据库中,我需要 使用WHERE子句。还将获取表名 动态地
  • 关于第2点,我如何向查询添加动态性。 我应该使用存储过程还是SHELL脚本?存储过程 似乎不支持加载数据填充功能
  • 如果我只剩下shell,有没有可以重用的示例脚本?CSV 文件名、表名和WHERE子句必须在运行时生成 时间
  • 此外,将动态计算要导出和导入的块的大小
  • 还有别的办法吗
  • 注意-这是一个基于INFOBRIGHT列的表,位于mysql之上。UPDATE查询没有性能,INFOBRIGHT不支持ALTER TABLE。

    您可以使用这种方法 创建一个临时表“temp_table”并使用此过程,然后在任何地方使用表名调用它,如下所示

    调用change_字段(“table_origen”)

    程序是这样工作的

  • 删除临时表中的数据
  • 插入此临时表格,其顺序已从表格原目录更改
  • 从表中删除\u origen
  • 将临时表格中的信息插入表格或
  • 你可能会发疯,你想接受多少变量

    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;