ON DUPLICATE KEY UPDATE
jednoduše provede SET
příkazy, které mu poskytnete v případě duplicitního klíče. Neporovnává jednotlivé hodnoty sloupců a pouze aktualizuje ty odlišné. Zní to, že to bude fungovat pro to, co chcete dělat, pokud máte správné sloupce definované jako UNIQUE KEY
nebo PRIMARY KEY
.
Co však normálně dělám, je spustit vložku a pak zachytit chybu a provést jinou akci, pokud potřebuji. To má nevýhodu v tom, že v případě duplikátu zadáte 2 dotazy, ale podle mého názoru je to mnohem lépe udržovatelné.
Příklad:
$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;
}
}