一連のレコードをインポートする必要があるデータベース テーブルがあります。既存のレコードが既にデータベースにある場合は上書きしたくないので、最初に選択クエリを実行して値があるかどうかを確認するように設定しましたが、明らかに行のインポートが速すぎてインデックスが挿入する行ごとに重複が作成されるので、追いついてください。
CSVファイルをインポートしています。
これが私がやっていることです(これはJoomlaシステム内にあるため、コードとオブジェクトの一部はjoomla固有です):
$fp = fopen(JPATH_ROOT.DS."tmp".DS.$filename, 'r');
//run insert query on each line of file
if(JRequest::getVar('importType')=="activated") {
while(!feof($fp)) {
while (($data = fgetcsv($fp, 1000, ",")) !== FALSE) {
if($this->checkUnique($data[0])) {
$this->runInsert2($data[0], $data[1], $data[2], $data[3]);
error_log("there is not already a code for ".$data[0]);
}
else {
error_log("there is already a code for ".$data[0]);
}
$row++;
}
}
}
fclose($fp);
ここにcheckUniqueがあります:
function checkUnique($vouchNum) {
$db =& JFactory::getDBO();
$query = "select COUNT(*) from arrc_Voucher where VoucherNbr=".$db->quote($vouchNum);
if(!$db->query()) error_log("error running unique check on ".$vouchNum." - " . $db->stderr());
$db->setQuery($query);
$count = $db->loadResult();
if($count>0) {
return false;
}
else {
return true;
}
}
そして、ここにrunInsert2があります:
function runInsert2($vouchNum,$BalanceInit,$BalanceCurrent,$ActivatedDT) {
$rightNow = date('Y-m-d H:i:s');
$db =& JFactory::getDBO();
if($ActivatedDT <> "NULL") {
$activatedDTtmp = strtotime($ActivatedDT);
$activatedDT = date('Y-m-d H:i:s',$activatedDTtmp);
}
else {
$activatedDT = $rightNow;
}
$query = "insert into arrc_Voucher (VoucherNbr,BalanceInit, BalanceCurrent, ActivatedDT)
values (". $db->quote($vouchNum). ", ".$db->quote($BalanceInit).",".$db->quote($BalanceCurrent).",".$db->quote($activatedDT).")";
error_log("query: ".$query);
$db->setQuery($query);
if (!$db->query()) error_log("error inserting voucher number ". $vouchNum . "-" . $db->stderr());
}
ここでどこが間違っているのかわかりませんが、誰かが私を助けてくれれば (または、重複を避けるためのより良い方向に向けてくれれば)、とても感謝しています。参考までに、「一意」であると見なしているフィールド (VoucherNbr) は、実際には主キーではなく、テーブル構造で一意としてマークされているものでもありません。これは、コーディング側で今すぐ回避する必要があるものです。