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)";

РЕДАКТИРОВАТЬ2:

Я добавил это, но не вставляю строки (пустая таблица)

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

person AdRock    schedule 22.10.2013    source источник
comment
ON DUPLICATE KEY UPDATE должен правильно работать для нескольких строк, поскольку вы можете использовать VALUES(columnName) для получения значения столбца из этой попытки вставки.   -  person Barmar    schedule 22.10.2013
comment
-1 за документацию, которая не имеет смысла   -  person Your Common Sense    schedule 22.10.2013
comment
@Ваш здравый смысл. Предложение о том, как заставить это работать вместо отрицательного голоса только потому, что я не понял документацию, будет более ценным   -  person AdRock    schedule 22.10.2013


Ответы (1)


После вызова implode() добавьте:

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

Предполагая, что colA имеет уникальный ключ, тогда всякий раз, когда этот столбец уже существует, это установит colB в новый colB из этой строки INSERT и оставит все остальные столбцы без изменений.

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;
person Barmar    schedule 22.10.2013
comment
Будет ли это для каждой строки, которую необходимо обновить, обновить эту строку новым значением. Некоторые строки с colB могут быть одинаковыми, другие требуют обновления с другими значениями. - person AdRock; 22.10.2013
comment
Да, я сделал, но это не имело смысла - person AdRock; 22.10.2013
comment
Просто проверяю, работает ли он, так как я думаю, что другая часть моего запроса получает все поля, которые мне нужны. Как только это сработает, я приму - person AdRock; 22.10.2013