que tenía una situación en la que necesitaba para actualizar o insertar en una tabla según dos campos (ambas claves foráneas) en que no pude establecer una restricción ÚNICA (por lo que INSERTAR ... EN ACTUALIZACIÓN DE LLAVE DUPLICADA no funcionará). Esto es lo que terminé usando:
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;
Este ejemplo se cribbed de una de mis bases de datos, con los parámetros de entrada (dos nombres y un número) sustituidas con [hasher_name], [hash_name] y [nuevo_valor]. El SELECT anidado ... LIMIT 1 extrae el primero del registro existente o de un nuevo registro (last_recogs.id es una clave primaria de autoincrement) y lo utiliza como el valor ingresado en REPLACE INTO.
¿Es "datenum" único? Puede usar [INSERTAR ... EN ACTUALIZACIÓN DUPLICADA DE LLAVE] (http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html) si es así. – Jacob
Posible duplicado de [Insertar en una tabla MySQL o actualización si existe] (http://stackoverflow.com/questions/4205181/insert-into-a-mysql-table-or-update-if-exists) –