ON DUPLICATE KEY UPDATE
chỉ cần thực hiện SET
các câu lệnh mà bạn cung cấp cho nó trong trường hợp có một khóa trùng lặp. Nó không so sánh các giá trị cột riêng lẻ và chỉ cập nhật những giá trị khác nhau. Có vẻ như nó sẽ hoạt động cho những gì bạn muốn làm miễn là bạn có (các) cột thích hợp được xác định là UNIQUE KEY
hoặc PRIMARY KEY
.
Tuy nhiên, những gì tôi thường làm là chạy bộ chèn và sau đó bắt lỗi và thực hiện một hành động khác nếu tôi cần. Điều này có mặt trái của việc đưa ra 2 truy vấn nếu có một bản sao nhưng theo ý kiến của tôi thì nó dễ bảo trì hơn nhiều.
Ví dụ:
$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;
}
}