【问题标题】:creating mysql dump like phpMyAdmin创建 mysql 转储,如 phpMyAdmin
【发布时间】:2009-07-03 09:37:17
【问题描述】:

我有一个脚本可以检索表上的大量数据。我想创建一个 mysqldump 将数据插入到另一个具有不同字段的数据库表中。我想要 phpMyAdmin 的格式,它重复 INSERT INTO Table VALUES(values1),(values2), ...(values100);如果达到一定数量的值集取决于您设置的内容。

例如:如果我有 550 个数据集,我想将数据除以 100,这样我将有 6 组 INSERT INTO 查询。

INSERT INTO tablename VALUES(value1), (value2), .... (value100);
INSERT INTO tablename VALUES(value101), (value102), .... (value200);
INSERT INTO tablename VALUES(value201), (value202), .... (value300);
INSERT INTO tablename VALUES(value301), (value302), .... (value400);
INSERT INTO tablename VALUES(value401), (value402), .... (value500);
INSERT INTO tablename VALUES(value501), (value502), .... (value550);

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    如果您使用 mysqldump 并希望将多行输出到单个插入中,那么您需要使用 --extended-insert 选项:

    mysqldump extended insert option

    我不确定是否可以使用 mysqldump 指定转储中生成的每个 INSERT 语句中包含特定数量的行。相反,您可以设置 net_buffer_length(尽管不建议您更改它),因此实际数量可能会因每行中的数据而异。

    【讨论】:

      【解决方案2】:

      你可以使用array_chunk(),比如:

      $toInsert = array( '(values1)', '(values2)', '(values3)', '(values4)' ); //etc.
      
      $sqlStart = 'INSERT INTO tablename (field1, field2, field3, etc) VALUES ';
      foreach (array_chunk($toInsert, 100) as $insertSet) {
          $sql = $sqlStart . implode(', ', $insertSet);
          //execute $sql
      }
      

      您实际上对数据做了很多工作吗?您可以使用INSERT INTO table (field1, field2) SELECT somefield, somefield2 FROM another table在 SQL 中完成所有操作

      【讨论】:

      • 感谢您。你知道如何使用 auto_increment 主键,即使在值没有主键值的情况下?
      • 我不确定你的意思?如果您从 INSERT 中省略主键,它将为您创建,但您可能需要指定要插入的字段列表,以便您可以指定要省略的字段。
      【解决方案3】:

      在获取行时,增加一个计数器,当它达到某个值时,是否创建一个新的插入语句?

      一些代码可能不正确(很长时间没有 PHP),但你可能会明白

      $i = 0;
      $insertstatements = array();
      $currentinsertstatement;
      
      while ($temp = mysql_fetch_assoc($result)) {
        // do something with the data
        $insertpart = "(value_xxx)";
        if ($i % 100 == 0) {
          // first value
          if ($i != 0) $insertstatements[count($insertstatements)] = $currentinsertstatement;
          $currentinsertstatement = "INSERT INTO tablename VALUES " . $insertpart;
        } else {
          $currentinsertstatement .= ", " . $insertpart;
          // somewhere in the middle of the insert statement
        }
        $i++;
      }
      if ($i % 100 != 0) {
        $insertstatements[count($insertstatements] = $currentinsertstatement;
      }
      

      【讨论】:

        【解决方案4】:

        如果您的存储引擎支持它们(例如 innoDB),您绝对应该使用事务来进行大量插入:

        开始;
        插入表名值...
        插入表名值...
        提交;

        如果出现问题,您可以安全地 ROLLBACK 上次操作、重新启动脚本等。

        【讨论】:

          猜你喜欢
          • 2014-09-29
          • 2016-07-14
          • 1970-01-01
          • 1970-01-01
          • 2012-05-29
          • 2013-09-07
          • 2015-01-18
          • 2014-05-30
          • 1970-01-01
          相关资源
          最近更新 更多