-2

我在表中有 2 列的条目不正确。表的大小达到数十亿条记录。我想在两列(c1 和 C2)之间交换数据所采用的方法是将数据以小块的形式导出到 CSV 文件中,然后使用更正的条目将其导入回来。例如,下面是数据集

--------
|C1 | C2 |
|3  | 4  |
|4  | 6  |

然后,我会将数据导出到以分号分隔的 CSV 文件(未显示完整命令),如下所示

SELECT C2,C1 FROM TABLE temp INTO OUTFILE /tmp/test.csv 

此类命令的输出将是

4;3
6;4

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

  | C1  C2 |
  | 3   4  |
  | 4   6  |

确实是OUTFILE和INFILE操作的问题,我相信

问题

  1. 这种方法有意义吗?除了数据交换之外,实际数据还需要某些列中的 NULL、int 值。
  2. 另一个复杂性是在生产数据库中,我需要使用WHERE子句。表名也将被动态获取。
  3. 参考第 2 点,我如何为查询添加动态性。我应该使用 STORED 过程还是 SHELL SCRIPT?STORED 过程似乎不支持 LOAD DATA INFILE 功能。
  4. 如果我剩下 shell,我可以重用任何示例脚本吗?CSV 文件名、表名和 WHERE 子句必须在运行时构建。
  5. 此外,将动态计算要导出和导入的块的大小。
  6. 还有其他方法吗?

注意 - 这是一个基于 mysql 的 INFOBRIGHT 列的表。UPDATE 查询是非执行的,并且 INFOBRIGHT 不支持 ALTER TABLE。

4

1 回答 1

0

您可以使用这种方法创建一个临时表“temp_table”并使用这个过程,然后从任何地方使用这样的表名调用它。

调用 change_fields('table_origen');

该过程是这样的

  1. 删除 temp_table 中的数据
  2. 插入到这个 temp_table 中,顺序从 table_origen 更改
  3. 从 table_origen 中删除
  4. 将 temp_table 中的信息插入 table_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;
于 2016-03-21T19:27:52.717 回答