Saya mengalami situasi di mana saya perlu memperbarui atau menyisipkan pada tabel sesuai dengan dua bidang (keduanya kunci asing) di mana saya tidak dapat mengatur batasan UNIK (jadi INSERT ... ON DUPLICATE KEY UPDATE tidak akan berfungsi). Inilah yang akhirnya saya gunakan:
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;
Contoh ini diambil dari salah satu database saya, dengan parameter input (dua nama dan angka) diganti dengan [hasher_name], [hash_name], dan [new_value]. SELECT ... LIMIT 1 yang bersarang menarik yang pertama dari record yang ada atau record baru (last_recogs.id adalah kunci primer autoincrement) dan menggunakannya sebagai masukan nilai ke REPLACE INTO.