ON DUPLICATE KEY UPDATE
po prostu wykonuje SET
oświadczenia, które mu dostarczysz w przypadku duplikatu klucza. Nie porównuje wartości poszczególnych kolumn, a jedynie aktualizuje wartości różniące się. Wygląda na to, że będzie działać dla tego, co chcesz zrobić, o ile masz odpowiednie kolumny zdefiniowane jako UNIQUE KEY
lub PRIMARY KEY
.
Jednak to, co zwykle robię, to uruchamianie wstawiania, a następnie przechwytywanie błędu i wykonywanie innej akcji, jeśli zajdzie taka potrzeba. Ma to wadę polegającą na wysyłaniu 2 zapytań, jeśli istnieje duplikat, ale moim zdaniem jest to znacznie łatwiejsze w utrzymaniu.
Przykład:
$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;
}
}