2016-05-04 3 views
0

LOAD DATA INFILEメソッド(データベースへのcsvデータ)を使用してカラムの1つのインクリメント値を保存しようとしています。私が努力していることは何も働いていません。余分なserial_noフィールドがなくても、すべてがうまくインポートされます。また、serial_noにハードコードされた値を設定すると、それも機能します。レコードごとに数値を1ずつ増やすことはできません。php mysqlを使用して各レコードに対して変数値を1ずつインクリメントする方法LOAD DATA INFILE

-

$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:[email protected]+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:[email protected]+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:[email protected]+1 "; 

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

は、AUTO_INCREMENTカラムを使用することは、更新プログラムを実行した後

。 –

+0

0に戻って特定の条件で再び開始する必要があるので、autoincrementフィールドタイプを使用することはできません。 – leoarce

+0

コードに条件が表示されません。これはあなたが書いたものです。「レコードごとに数値を1つ増やしてください。ただし、csvを読み込んだ後で列を更新することはできます。 –

答えて

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); 
+0

は "tmpファイルアドレス"を "tmp_csv_addr.csv"のように改善しますか? fopenの "a"は何ですか? whileループは何をしていますか? – leoarce

+0

はい、新しいCSVファイルの一時アドレスを作成してください。 $ target_fileのCSVを新しいファイルにコピーします。しかし、新しいフィールドを一時ファイルに追加することもできます。フィールドは 'serial_no'値を含みます。 –

+0

'a'はfopenを意味し、ファイルを開いて書き込みを行い、最後にポインタを置きます。したがって、データが追加されます。 –

0

auto_incementカラム(ID)を持つテーブルにデータをロードします。たぶん、このような

UPDATE list_data 
SET serail_no = MOD(id, 1000000000) 
+0

私はそれについて知らない。他の誰かから助けてもらえますか? – leoarce

関連する問題