【问题标题】:how to increment variable value by 1 for each record with php mysql LOAD DATA INFILE如何使用php mysql LOAD DATA INFILE将每条记录的变量值增加1
【发布时间】:2016-08-30 09:05:21
【问题描述】:

我正在尝试使用 LOAD DATA INFILE 方法(csv 数据到数据库)为其中一列保存递增值。我正在尝试的任何事情都不起作用。如果没有额外的 serial_no 字段,一切都可以正常导入,如果我将硬编码值设置为 serial_no,那也可以。只是不能让它为每条记录增加 1 的数值。

--

$loadsqlfiletodb = "SET @a:=".$serial_no_max_new.";
        LOAD DATA LOCAL INFILE '".$target_file."'
        INTO TABLE ".DB_NAME2.".list_data
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY '\n'
        IGNORE 1 LINES 
        (first,last,address,city,state,zip,company,tracking_number,vin,year,make,model,rough,average,clean,misc1,misc2,misc3,misc4,misc5,misc6,misc7,misc8,misc9,misc10,list,email,phone,image_name,image_path)
        SET cid = ".$campaignid.",
            jid = ".$jobid.",
            serial_no = @a:=@a+1 ";

        mysql_query($loadsqlfiletodb) or die(mysql_error());

--

$loadsqlfiletodb = "
        SET @a:='".$serial_no_max_new."'
        LOAD DATA LOCAL INFILE '".$target_file."'
        INTO TABLE ".DB_NAME2.".list_data
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY '\n'
        IGNORE 1 LINES 
        (first,last,address,city,state,zip,company,tracking_number,vin,year,make,model,rough,average,clean,misc1,misc2,misc3,misc4,misc5,misc6,misc7,misc8,misc9,misc10,list,email,phone,image_name,image_path)
        SET cid = ".$campaignid.",
            jid = ".$jobid.",
            serial_no = @a:=@a+1 ";

        mysql_query($loadsqlfiletodb) or die(mysql_error());

--

$loadsqlfiletodb = "LOAD DATA LOCAL INFILE '".$target_file."'
        INTO TABLE ".DB_NAME2.".list_data
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY '\n'
        IGNORE 1 LINES 
        (first,last,address,city,state,zip,company,tracking_number,vin,year,make,model,rough,average,clean,misc1,misc2,misc3,misc4,misc5,misc6,misc7,misc8,misc9,misc10,list,email,phone,image_name,image_path)
        SET cid = ".$campaignid.",
            jid = ".$jobid.",
            serial_no = ".$serial_no_max_new."+1 ";

        mysql_query($loadsqlfiletodb) or die(mysql_error());

--

$loadsqlfiletodb = "LOAD DATA LOCAL INFILE '".$target_file."'
        INTO TABLE ".DB_NAME2.".list_data
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY '\n'
        IGNORE 1 LINES 
        (first,last,address,city,state,zip,company,tracking_number,vin,year,make,model,rough,average,clean,misc1,misc2,misc3,misc4,misc5,misc6,misc7,misc8,misc9,misc10,list,email,phone,image_name,image_path)
        SET cid = ".$campaignid.",
            jid = ".$jobid.",
            serial_no = ".$serial_no_max_new." = ".$serial_no_max_new."+1 ";

        mysql_query($loadsqlfiletodb) or die(mysql_error());

更新:

这里是完整的东西。序列号始终为 9 位数字。不多不少。当序列达到 999999999 时,下一个记录的序列将是 000000000。但是,不要担心从九到零的部分。此时我正在尝试弄清楚如何使用将文件导入数据库的 LOAD DATA INFILE 方法将该列的值增加 1。

$query_max = mysql_fetch_array(mysql_query("SELECT id, latest_serial_no FROM ".DB_NAME2.".latest_serial_number WHERE id=1"), MYSQL_ASSOC);
        $serial_no_max = $query_max["latest_serial_no"];
        $serial_no_max_new = $serial_no_max;
        if ($serial_no_max > 999999998) {$serial_no_max_new = 000000000;}

        $padd = "";
        $serial_len = strlen($serial_no_max_new);
        if($serial_len < 9) {
            $serial_len = (9 - $serial_len);
            for($is=0;$is<$serial_len;$is++) {
                $padd .= "0";
            }
            $serial_no_max_new = $padd . $serial_no_max_new;
        }
        $query_serial = trim($serial_no_max_new);
        //echo "q_s: ".$query_serial;

        //Import uploaded file to Database
        //$target_file is where the uploaded file is located

        $loadsqlfiletodb = "SET @a:=".$query_serial.";
        LOAD DATA LOCAL INFILE '".$target_file."'
        INTO TABLE ".DB_NAME2.".list_data
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY '\n'
        IGNORE 1 LINES 
        (first,last,address,city,state,zip,company,tracking_number,vin,year,make,model,rough,average,clean,misc1,misc2,misc3,misc4,misc5,misc6,misc7,misc8,misc9,misc10,list,email,phone,image_name,image_path)
        SET cid = ".$campaignid.",
            jid = ".$jobid.",
            serial_no = @a:=@a+1 ";

        mysql_query($loadsqlfiletodb) or die(mysql_error());

【问题讨论】:

  • 使用 auto_increment 列。
  • 在一定条件下需要回到0重新开始,所以不能使用自增字段类型。
  • 我在您的代码中看不到任何条件。这就是你写的:“为每条记录增加 1 的数值”。但是 - 您可以在加载 csv 后更新该列。
  • 您能否让您的程序的一部分添加一个新行,将您的列值设置为 0,并通过自动递增再次从 0 递增?
  • 我不知道这意味着什么或如何完成。

标签: php mysql csv load-data-infile


【解决方案1】:

可能是这样的:

 /*1 get last serial number.

 open csv file.
 foreach row in csv file:
    increment serial number.
    if max number
       set serial number to 0.
    add new field to csv row

 close csv file

 insert csv to database*/


    $query_max = mysql_fetch_array(mysql_query("SELECT id, latest_serial_no FROM ".DB_NAME2.".latest_serial_number WHERE id=1"), MYSQL_ASSOC);
    $serial_no_max = $query_max["latest_serial_no"];
    $serial_no_max_new = $serial_no_max;
    if ($serial_no_max > 999999998) {$serial_no_max_new = 000000000;}

    $padd = "";
    $serial_len = strlen($serial_no_max_new);
    if($serial_len < 9) {
        $serial_len = (9 - $serial_len);
        for($is=0;$is<$serial_len;$is++) {
            $padd .= "0";
        }
        $serial_no_max_new = $padd . $serial_no_max_new;
    }
    $query_serial = trim($serial_no_max_new);
    //echo "q_s: ".$query_serial;

    // Add serail number to csv code
    $csv = fopen($target_file, "r");
    $tmp_csv_addr = $target_file . "2";
    $tmp_csv = fopen($tmp_csv_addr, "a");
    while (($data = fgetcsv($csv, 0, ",")) !== FALSE) {
        $data[] = $query_serial;
        fputcsv($tmp_csv, $data, ",");
    }
    fclose($csv);
    fclose($tmp_csv);

    // Insert into database
    $loadsqlfiletodb = "LOAD DATA LOCAL INFILE '".$tmp_csv_addr."'
    INTO TABLE ".DB_NAME2.".list_data
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '\"' 
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES 
    (first,last,address,city,state,zip,company,tracking_number,vin,year,make,model,rough,average,clean,misc1,misc2,misc3,misc4,misc5,misc6,misc7,misc8,misc9,misc10,list,email,phone,image_name,image_path,serial_no)
    SET cid = ".$campaignid.",
        jid = ".$jobid;

    mysql_query($loadsqlfiletodb) or die(mysql_error());

    unlink($tmp_csv);

【讨论】:

  • “制作 tmp 文件地址”会不会像这样更好:“tmp_csv_addr.csv”? fopen中的“a”是什么? while 循环在做什么?
  • 是的,为新的 CSV 文件创建临时地址。并将 $target_file 上的 CSV 复制到新文件。但也要在临时文件中添加新字段。字段将包含serial_no 值。
  • 'a' 在 fopen 的意思是,打开文件写入并将指针指向末尾。所以数据会被追加。
  • 通过 while 循环,1) 递增 serial_no 值 1) 将行从 $target_file 复制到临时 CSV 文件(但将新字段添加到行,其中将包含递增的 serial_no)。
  • 然后,加载到表中,临时 CSV。并用 unlink() 函数删除它
【解决方案2】:

将您的数据加载到带有 auto_incement 列 (id) 的表中。

之后运行更新:

UPDATE list_data
SET serail_no = MOD(id, 1000000000)

【讨论】:

  • 我不知道。我可以请别人帮忙吗?
猜你喜欢
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2012-12-14
  • 2017-12-26
  • 2023-03-03
  • 1970-01-01
  • 2014-05-06
相关资源
最近更新 更多