ON DUPLICATE KEY UPDATE
просто изпълнява SET
изявления, които му предоставяте в случай на дублиран ключ. Той не сравнява стойности на отделни колони и само актуализира различните. Звучи сякаш ще работи за това, което искате да правите, стига да имате правилните колони, дефинирани като UNIQUE KEY
или PRIMARY KEY
.
Но това, което обикновено правя, е да стартирам вмъкването и след това да хвана грешката и да извърша различно действие, ако трябва. Това има обратната страна на издаването на 2 заявки, ако има дубликат, но според мен е много по-поддържаемо.
Пример:
$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;
}
}