У мене виникла ситуація, коли мені потрібно було оновити або вставити в таблицю відповідно до двох полів (обидва зовнішні ключі), в яких я не міг встановити єдине обмеження (так ВСТАВКА ... НА ДУПЛІКАТИ КЛЮЧНОГО ОНОВЛЕННЯ не буде працювати). Ось що я закінчив:
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;
Цей приклад наводиться з однієї з моїх баз даних, вхідні параметри (два імені та номер) замінені на [hasher_name], [hash_name] та [new_value]. Вкладений SELECT ... LIMIT 1 витягує першу з наявних або нових записів (last_recogs.id є первинним ключем для автоматичного збільшення) і використовує це як введення значення в ЗАМІНУВАННЯ ДО.