2015-11-16 26 views
0

我有未知的鍵和值從CSV導入到數據庫。
我的代碼是
MySQL - 插入介紹,如果存在更新

while($data = fgetcsv($handle,1000,",",'"')) 
{ 
$data=array_map('addslashes',$data); // apply addslashes() to all values 
$data=array_combine($csv_fields,$data); // csv fields assoc (key=>value) 
$data=array_intersect_key($data,$tbl_fields); // discard redundant 
$tbl_fields_str=implode("`,`",array_keys($data)); 
$tbl_vals_str=implode("','",array_values($data)); 
$q="INSERT INTO `cmid` (`cmid`,`$tbl_fields_str`) VALUES ('$cmidtrenutni','$tbl_vals_str') ON DUPLICATE KEY UPDATE (`$tbl_fields_str`) VALUES ('$tbl_vals_str')"; 
$conn->query($q); 
} 

我需要插入,如果存在,更新。 我嘗試以上代碼,但不工作。
我找到類似http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html
但這沒有幫助我的方式導致我的表沒有定義字段。每個輸入的鍵和值都不相同。
任何解決方案如何做到這一點?

+2

的對重複密鑰需要在表中的主或唯一索引,否則。如果你想更新一行,如果它已經存在,這似乎暗示你所檢查的任何列都是唯一的,所以我建議在列上創建一個唯一的索引。 – DBug

回答

2

這是您的查詢:

INSERT INTO `cmid` (`cmid`, `$tbl_fields_str`) 
    VALUES ('$cmidtrenutni', '$tbl_vals_str') 
    ON DUPLICATE KEY UPDATE (`$tbl_fields_str`) VALUES ('$tbl_vals_str'); 

的問題是UPDATE一部分。您需要拆分值,所以它看起來像:

INSERT INTO `cmid` (`cmid`, `$tbl_fields_str`) 
    VALUES ('$cmidtrenutni', '$tbl_vals_str') 
    ON DUPLICATE KEY UPDATE 
     col1 = newcol1val, 
     col2 = newcol2val, 
     . . . 

您正在使用短手是無效的語法。

+0

是的,但列和值是未知的。 –

+0

@ r00t-err0r。 。 。您需要修復查詢以使用正確的語法。 –

1

試試這個:

$q="INSERT INTO `cmid` (`cmid`,`$tbl_fields_str`) VALUES ('$cmidtrenutni','$tbl_vals_str') ON DUPLICATE KEY UPDATE cmid=cmid"; 

但我更喜歡使用INSERT IGNORE您的問題:

$q="INSERT IGNORE INTO `cmid` (`cmid`,`$tbl_fields_str`) VALUES ('$cmidtrenutni','$tbl_vals_str')"; 
0

你不能在MySQL數據庫 「未知」 列。如果你想在mysql表中存儲key-value對,你應該有一個兩列的表:一個名爲「key」,另一個名爲「value」。添加額外的列「cmid」來分組您的配對。

此表應該在「cmid」和「key」列上具有主索引。

那麼你應該像一個查詢插入值:

$sqlVals = ""; 
foreach ($data as $key => $val) { 
    $sqlVals .= "($cmidtrenutni, $key, $val),"; 
} 
$sqlVals = substr($sqlVals, 0, -1); //remove last comma. 

$query = "REPLACE INTO `myTable` (`cmid`, `key`,`value`) VALUES $sqlVals"; 
相關問題