Tôi đã gặp trường hợp cần cập nhật hoặc chèn vào bảng theo hai trường (cả hai khóa ngoại) mà tôi không thể đặt ràng buộc DUY NHẤT (vì vậy CHÈN ... TRÊN CẬP NHẬT KHÓA DUPLICATE sẽ không hoạt động). Đây là những gì tôi đã sử dụng:
replace into last_recogs (id, hasher_id, hash_id, last_recog)
select l.* from
(select id, hasher_id, hash_id, [new_value] from last_recogs
where hasher_id in (select id from hashers where name=[hasher_name])
and hash_id in (select id from hashes where name=[hash_name])
union
select 0, m.id, h.id, [new_value]
from hashers m cross join hashes h
where m.name=[hasher_name]
and h.name=[hash_name]) l
limit 1;
Ví dụ này được lấy từ một trong các cơ sở dữ liệu của tôi, với các tham số đầu vào (hai tên và một số) được thay thế bằng [hasher_name], [hash_name] và [new_value]. SELECT ... LIMIT 1 lồng nhau kéo bản ghi đầu tiên của bản ghi hiện có hoặc bản ghi mới (last_recogs.id là khóa chính tự động gia tăng) và sử dụng nó làm giá trị đầu vào cho REPLACE INTO.