【问题标题】:Data manipulation in a mysql tablemysql表中的数据操作
【发布时间】:2016-03-21 18:09:30
【问题描述】:

我在表格中有 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?存储过程 似乎不支持 LOAD DATA INFILE 功能。
  4. 如果我只剩下 shell,我可以重复使用任何示例脚本吗? CSV 文件名、表名和 WHERE 子句必须在运行时构建 时间。
  5. 还将动态计算要导出和导入的块的大小。
  6. 还有其他方法吗?

注意 - 这是一个基于 mysql 的 INFOBRIGHT 列的表。 UPDATE 查询无效,INFOBRIGHT 不支持 ALTER TABLE。

【问题讨论】:

  • 1) 这是一个非常广泛的问题,答案可能主要基于意见。 2)这里没有问题。 3) 存储过程中不允许将数据加载到文件中。 4)同样,一个过于宽泛的问题。不太可能有人会从头开始为您编写脚本。 5) 同样,这里没有问题 6) 这与 1) 基本相同。所以,我不太清楚你在这里期待什么样的答案。
  • 只需使用数据库中的新表将数据复制到。转换完所有数据后,删除原始数据并将新表重命名为原始数据

标签: mysql shell csv stored-procedures infobright


【解决方案1】:

您可以使用这种方法 创建一个临时表 'temp_table' 并使用此过程,然后在任何地方使用此表的名称调用它。

调用 change_fields('table_origen');

过程是这样的

  1. 删除 temp_table 中的数据
  2. 从 table_origen 更改顺序插入此 temp_table
  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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多