我有一個數據庫表,我需要導入一堆記錄。如果它們已經存在於數據庫中,我不想覆蓋現有記錄,所以我已經設置好了首先執行選擇查詢以檢查是否有值,但顯然行索引導入過快跟上,因爲我正在爲我插入的每一行創建重複項。如何在將行導入到mySQL之前檢查值是否唯一?
我正在導入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)的領域實際上並不是主鍵,或者在表格結構中以任何方式標記爲唯一,並且不能。這是我們現在需要在編碼結束時解決的問題。
您可以在一個查詢中插入所有內容,並通過DELETE FROM table刪除重複項WHERE ID IN(SELECT ID FROM表GROUP BY字段HAVING COUNT(field)> 2)' – Andrew 2010-10-19 23:03:38
通常我在列上放置一個唯一約束,處理有人試圖添加副本時的錯誤。 – 2010-10-19 23:12:25
@OMG Ponies - 是的,我們通常也對列有一個唯一的約束,但這是客戶的數據庫,他不希望對錶設計做任何更改。 – EmmyS 2010-10-20 00:42:12