ON DUPLICATE KEY UPDATE
simplemente realiza el SET
declaraciones que le proporcione en el caso de una clave duplicada. No compara valores de columnas individuales y solo actualiza los que difieren. Parece que funcionará para lo que desea hacer siempre que tenga las columnas adecuadas definidas como UNIQUE KEY
o PRIMARY KEY
.
Sin embargo, lo que normalmente hago es ejecutar la inserción y luego detectar el error y realizar una acción diferente si es necesario. Esto tiene la desventaja de emitir 2 consultas si hay un duplicado pero, en mi opinión, es mucho más fácil de mantener.
Ejemplo:
$db = new PDO($dsn, $user, $pass);
$stmt = $db->prepare('INSERT INTO some_tbl (col1,col2,col3) VALUES (?,?,?)');
$values = array('Col 1 value','Col 2 Value', 'Col 3 Value');
try {
$db->execute($values);
} catch (PDOException $e) {
if($e->getCode() == 23000){
// dupe key do some other action whether update or otherwise
} else {
// rethrow non dupe errors
throw $e;
}
}