ฉันมีสถานการณ์ที่ฉันจำเป็นต้องอัปเดตหรือแทรกบนตารางตามสองฟิลด์ (คีย์ต่างประเทศทั้งสอง) ซึ่งฉันไม่สามารถตั้งค่าข้อ จำกัด ที่ไม่ซ้ำกันได้ (ดังนั้น INSERT ... ในการอัปเดตคีย์ซ้ำจะไม่ทำงาน) นี่คือสิ่งที่ฉันใช้:
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 เป็นคีย์หลักที่สร้างขึ้นโดยอัตโนมัติ) และใช้เป็นค่าที่ป้อนลงใน REPLACE INTO