【问题标题】:Insert records from array in MySQL query在 MySQL 查询中从数组中插入记录
【发布时间】:2017-10-26 05:44:15
【问题描述】:

我有一个包含 1500000 条记录的数组,如下所示

Array = ["2","3","6","7","A5057",......]

我如何能够直接从我使用以下查询尝试的 MySQL 命令将所有这些记录插入到表中(只有一个字段 (XXX_id))

INSERT INTO TABLE_NAME (XXX_id) VALUES (["2","3","6","7","A5057",......]);

如果我们必须从 php 脚本插入,毫无疑问我们可以关注this question 表单社区。​​p>

【问题讨论】:

  • 您将需要一个程序来完成您想要的操作
  • 使用存储过程,先将数组拆分成行存入临时表,然后将数据从临时表插入到物理表中

标签: mysql arrays


【解决方案1】:

你可以像这样创建数组格式

INSERT INTO `TABLE_NAME`(`XXX_id`) VALUES (1),(2),(3),(4)

Read more

【讨论】:

    【解决方案2】:

    实际上有两种方法可以做到这一点

    1.LOAD INFILE
    
    LOAD DATA LOCAL INFILE  
    'path/file.csv'
    INTO TABLE giata_table 
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    

    2.使用multi-row insert

    INSERT INTO `TABLE_NAME`(`XXX_id`) VALUES (1),(2),(3),(4)
    

    【讨论】:

      【解决方案3】:

      你可以使用multi-row insert来实现你想要的

      只需使用 PHP 将数组格式化为 VALUES (X), (X), ...

      【讨论】:

      • 我认为尝试对 150 万行执行此操作将超过 max_packet_size 限制。
      • 这是依赖于 Op 的 MySQL 服务器(并且无论如何都可以更改),但它仍然是非常大的插入的优化方式
      【解决方案4】:

      将数组数据放入文件中,每行一个ID。然后你可以使用LOAD DATA INFILE:

      LOAD DATA INFILE 'filename'
      INTO TABLE table_name (XXX_id)
      

      【讨论】:

      • 我正在尝试从 phpmyadmin 插入记录。
      • 你标记了它php
      • phpMyAdmin 中没有数组。它是一个 Web 界面,而不是一种编程语言。所以现在你的问题没有意义。
      • 我错了,我改了标签。
      • 是的,你是对的,我不能使用数组,但可以将我的数组更改为@Plotisateur 提到的格式。
      【解决方案5】:

      您的查询应该是这样的:

      INSERT INTO TABLE_NAME (XXX_id) VALUES (2),(3),(6),(7),(A5057),......;
      

      但是您将仅使用一个查询插入大量行。因此,它可能会超出 MySQL 查询限制。对于 MySQL,每个查询通常都受到 max_allowed_pa​​cket 的限制。

      1) 在 MySQL 中执行以下命令查看 'max_allowed_pa​​cket' 的默认值:

      show variables like 'max_allowed_packet';
      

      2) 标准 MySQL 安装的默认值为 1048576 字节 (1MB)。但这可以通过将较高的值设置为 500MB 或更多来增加:

      SET GLOBAL max_allowed_packet=524288000;
      

      3) 在 MySQL 中按照 1) 命令再次检查 max_allowed_pa​​cket 值。

      希望对你有所帮助。

      【讨论】:

        【解决方案6】:

        我们可以使用 LOAD DATA LOCAL INFILE

        LOAD DATA LOCAL INFILE  
        'path/file.csv'
        INTO TABLE giata_table 
        FIELDS TERMINATED BY ',' 
        ENCLOSED BY '"'
        LINES TERMINATED BY '\n'
        

        这将获取表中的所有记录,我们必须确保表中的字段名称和 csv 文件中的标题匹配。

        如果这对您不起作用,那么您可以按照 @Plotisateur 和 @Aiyaz khorajia 的回答作为

        INSERT INTO `TABLE_NAME`(`XXX_id`) VALUES (1),(2),(3),(4)
        

        【讨论】:

          【解决方案7】:
          $string =  ' (" '.implode(' "),(" ',$array).' ") ';
          $query = "INSERT INTO TABLE_NAME (XXX_id) VALUES {$string}";
          
          IF you have large number of records, I would suggest you to make a bunch of 100-200 records and then insert:
          
          for($i=0; $i<sizeof($array); $i++){
          
             $string = $string==""?'('.$array[$i].')':$string.',('.$array[$i].')';
             if($i % 100 == 0){
               $query = INSERT INTO TABLE_NAME (XXX_id) VALUES ($string);
               // execute the query
              $string = "";
            }
          }
          
          if($string != ""){
          $query = INSERT INTO TABLE_NAME (XXX_id) VALUES ($string);
               // execute the query
          }
          

          【讨论】:

          • 我不认为他想把它们都放在一个记录中,我认为每一个都是单独的行。
          【解决方案8】:

          在您的程序中执行以下操作以解决您的问题:

          -- Temporary table to hold splited row value of string
          
          
          drop temporary table if exists temp_convert;
                  create temporary table temp_convert(split_data varchar(2056) );
          
                 -- dynamic query to break comma separated string as rows and 
          
          insert into column
                  set @sql = concat("
                  insert into temp_convert (split_data) 
                                         values ('", replace(
                  ( select group_concat(in_string) as converted_data), ",", "'),('"),"'
                                                             );"
                  );
                  prepare stmt1 from @sql;
                  execute stmt1;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-16
            • 2015-02-12
            • 2015-05-30
            • 2022-01-22
            • 2012-07-16
            • 2012-03-06
            相关资源
            最近更新 更多