मेरे पास एक ऐसी स्थिति थी जहां मुझे दो फ़ील्ड्स (दोनों विदेशी कुंजियाँ) के अनुसार टेबल पर अपडेट या इंसर्ट करने की ज़रूरत थी, जिस पर मैं एक UNIQUE बाधा नहीं डाल सकता था (इसलिए INSERT ... ON DUPLICATE KEY UPDATE काम नहीं करेगा)। यहाँ मैंने क्या उपयोग किया है:
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] के साथ बदल दिया गया है। नेस्टेड सेलेक्ट ... लिमिट 1 मौजूदा रिकॉर्ड या नए रिकॉर्ड (last_recogs.id या तो एक ऑटोइंटरमेंट प्राथमिक कुंजी है) के पहले को खींचता है और REPLACE INTO में मूल्य इनपुट के रूप में उपयोग करता है।