AdR*_*ock 1 sql pdo bulkinsert insert-update
我有这个代码,可以在一个查询中插入多行.
我不想做的是,如果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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
如何更新多列?它是否正确?
$sql .= " ON DUPLICATE KEY UPDATE status = VALUES(colB, colC)";
Run Code Online (Sandbox Code Playgroud)
EDIT2:
我添加了这个,但我没有插入行(空表)
$sql .= " ON DUPLICATE KEY UPDATE colA = VALUES(colA),
colB = VALUES(colB),
colC = VALUES(colC),
colD = VALUES(colD),
colE = VALUES(colE))";
Run Code Online (Sandbox Code Playgroud)
implode()通话结束后,添加:
$sql .= " ON DUPLICATE KEY UPDATE colB = VALUES(colB)";
Run Code Online (Sandbox Code Playgroud)
假设colA有一个唯一键,那么每当该列已经存在时,这将从该行的那一行设置colB为new ,并保持所有其他列不变.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);
Run Code Online (Sandbox Code Playgroud)
该陈述与以下两个陈述相同:
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;
Run Code Online (Sandbox Code Playgroud)