1

我有这段代码可以在一个有效的查询中插入多行。

我不希望它做的是 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))";
4

1 回答 1

7

调用后implode(),添加:

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

假设colA有一个唯一的键,那么只要该列已经存在,这将设置为该行的colB新键,并保持所有其他列不变。colBINSERT

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;
于 2013-10-22T14:04:22.563 回答