我正在开发一个上传CSV并更新MySQL表的项目。 在我的sql insert语句结束时,我有一个“on duplicate key update ...”语句。
我的问题是,PDO rowCount()似乎为更新的行返回2x。 例如,当我第一次上传CSV时,我总共得到100行(csv行的数量),而rowCount返回100,这是有意义的,因为我插入了100行。
但是,如果我再次上传相同的文件,则更新所有100行(我更新unix时间戳),并且rowCount返回200.我认为这是因为rowCount每次更新返回2,插入时返回1。
我的假设是否正确?有没有人遇到过此问题,是否有一个不涉及100个单独的插入语句的解决方案?我希望能够显示csv中的总行数,插入的新行总数以及更新的总行数。
$sql = 'INSERT INTO projects (' . implode($fields,',') . ') VALUES';
$rowCount = count($csvData);
$tmp = array();
for( $i = 0; $i < $rowCount; $i++ ){
$placeholders = array();
foreach( $fields as $key=>$val ){
/* do some post processing for special characters */
switch($val){
case 'description':
$value = !empty($csvData[$i][$_POST[$val]]) ? $csvData[$i][$_POST[$val]] : NULL;
array_push($tmp,$value);
break;
case 'country':
$value = !empty( $csvData[$i][$_POST[$val]] ) ? implode(' ',array_unique(explode(' ', $csvData[$i][$_POST[$val]]))) : NULL;
$value = str_replace(array(',','.','\''),'',$value);
array_push($tmp,$value);
break;
case 'add_unixtime':
array_push($tmp,time());
break;
case 'project_type':
array_push($tmp,strtolower($formData['project_type']));
break;
default:
$value = !empty($csvData[$i][$_POST[$val]]) ? str_replace(array(',','.','\''),'',$csvData[$i][$_POST[$val]]) : NULL;
array_push($tmp,$value);
break;
}
array_push($placeholders,'?');
}
$sql .= ' (' . implode($placeholders,',') . '),';
}
/*
detect duplicate projects based on project_number & project_type
mysql unique index created with (project_number + project_type)
if duplicate found, update row
*/
$sql = rtrim($sql,',');
$sql .= 'ON DUPLICATE KEY UPDATE';
foreach($fields as $key=>$val){
$sql .= ' ' . $val . ' = VALUES(' . $val . '),';
}
$sql = rtrim($sql,',');
/* update database */
$query = $this->dbc->prepare($sql);
if( $query->execute($tmp) ){
$result = array('total_rows'=>$rowCount,'modified_rows'=>$query->rowCount());
}
/* return result */
return $result;
以下是为3行插入生成的查询。
INSERT INTO projects (project_number, project_value, project_name,
address1, address2, city, state, zip, country, description,
project_type, add_unixtime )
VALUES (?,?,?,?,?,?,?,?,?,?,?,?),
(?,?,?,?,?,?,?,?,?,?,?,?),
(?,?,?,?,?,?,?,?,?,?,?,?)
ON DUPLICATE KEY UPDATE
project_number = VALUES(project_number),
project_value = VALUES(project_value),
project_name = VALUES(project_name),
address1 = VALUES(address1), address2 = VALUES(address2),
city = VALUES(city), state = VALUES(state), zip = VALUES(zip),
country = VALUES(country), description = VALUES(description),
project_type = VALUES(project_type),
add_unixtime = VALUES(add_unixtime);
答案 0 :(得分:10)
根据MySQL手册:
使用ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为1;如果更新现有行,则每行受影响的行值为2;如果现有行设置为其当前值,则为0。
http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html