2013-10-22 93 views
0

我有這個代碼插入多個行中的一個查詢工作。PHP PDO插入批量記錄或更新(如果存在)

我希望做的不是如果colA已經存在於數據庫更新colB中。

我已經看過使用INSERT ON DUPLICATE KEY UPDATE,但是我只能看到它在一行可以有1000行的情況下工作。

如何在我的代碼上使用INSERT/UPDATE?

$sql = 'INSERT INTO table (colA, colB, colC, colD, colE) VALUES'; 
$insertQuery = array(); 
$insertData = array(); 
$n = 0; 
// and loop through the array binding values from each row 
// to the placeholders before execution 
// placeholders names increment starting at 0 to array length 
foreach ($rows as $row) { 
    $insertQuery[] = '(
     :colA' . $n . ', 
     :colB' . $n . ', 
     :colC' . $n . ', 
     :colD' . $n . ', 
     :colE' . $n . ' 
    )'; 

    $insertData['colA' . $n] = $row['colA']; 
    $insertData['colB' . $n] = $row['colB']; 
    $insertData['colC' . $n] = $row['colC']; 
    $insertData['colD' . $n] = $row['colD']; 
    $insertData['colE' . $n] = $row['load_note']; 
    $insertData['last_updated' . $n] = $row['colE']; 
    $n++; 
} 

// prepare the query and exeute it 
if (!empty($insertQuery)) { 
    $sql .= implode(', ', $insertQuery); 
    $stmt = $db->prepare($sql); 
    $stmt->execute($insertData); 
} 

編輯:

如何更新多個列?它是否正確?

$sql .= " ON DUPLICATE KEY UPDATE status = VALUES(colB, colC)"; 

EDIT2:

我加了這個,但我沒有得到任何行插入(空表)

$sql .= " ON DUPLICATE KEY UPDATE colA = VALUES(colA), 
        colB = VALUES(colB), 
        colC = VALUES(colC), 
        colD = VALUES(colD), 
        colE = VALUES(colE))"; 
+0

'對重複KEY UPDATE'應能正常工作了多行,因爲你可以用'VALUES(列名)'來獲取值該嘗試插入的列的列。 – Barmar

+0

-1爲無意義的文檔 –

+2

@您的常識。關於如何讓這個工作而不是僅僅因爲我不理解文檔而得到這個工作的建議將更多地被讚賞 – AdRock

回答

6

implode()電話後,添加:

$sql .= " ON DUPLICATE KEY UPDATE colB = VALUES(colB)"; 

假設colA已一個唯一的鍵,那麼只要該列已經存在,這將設置colBINSERT的那一行中的新的colB相比較,並且保持所有其他列不變。

http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html

它有以下的例子,示出了每個重複行獨立地處理。

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) 
    ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); 

該聲明等同於以下兩個語句:

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=3; 
INSERT INTO table (a,b,c) VALUES (4,5,6) 
    ON DUPLICATE KEY UPDATE c=9; 
+0

對於每一個需要更新的行都會這樣做,更新那些行的新值。有些colB行可能與其他行需要更新不同的值 – AdRock

+2

是的,您是否打算閱讀我鏈接的文檔? – Barmar

+0

是的,我做了,但它沒有意義 – AdRock

相關問題