【发布时间】: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