Muy a menudo, quiero ejecutar una consulta en uno de mis usuarios donde quiero una fila almacenada y asociada con ese usuario, en una relación de 1 a 1. Entonces, digamos (esto es solo un ejemplo arbitrario), que tengo una tabla que hace un seguimiento del auto de un usuario, junto con algo de información sobre el auto. Cada usuario puede tener 0 o 1 automóvil. Si el usuario no tiene automóvil, no hay ninguna entrada en la tabla para ese usuario. tablaMySQL "buena" manera de insertar una fila si no se encuentra, o actualizarla si se encuentra
coches (de nuevo, sólo un ejemplo): identificación, user_id, car_make, car_model
Así, cuando actualice esta tabla, siempre termino haciendo algo como esto (pseudo-código):
result = SELECT * FROM cars WHERE user_id=5
if (num_rows(result)>0){
UPDATE cars SET car_make='toyota', car_model='prius' WHERE user_id=5
}else{
INSERT INTO cars (user_id, car_make, car_model) VALUES (5, 'toyota', 'prius')
}
¿Cómo puedo convertir esto en una declaración elegante que funciona "atómicamente"? ¿Qué sucede si, en otro proceso, la fila se ELIMINA entre las instrucciones SELECT y UPDATE? Mi instrucción UPDATE fallará donde debería haberse ejecutado la instrucción INSERT. ¡Y siento que necesito hacer dos declaraciones similares (pero diferentes) para lograr lo mismo! Lo que necesito es una declaración que me asegure que los datos que deseo existen en la tabla, especialmente cuando solo quiero 1 fila que satisfaga mis requisitos. Por ejemplo, podría ser algo así como (esto es totalmente inventada por supuesto):
MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius'
esta manera, si user_id de 5 ya existe, se actualizará, de lo contrario, se insertará. Además, si he cambiado los requisitos, por ejemplo, decir que cada usuario puede tener cero o uno vagones de un car_make dado, entonces podría indicar, además, que:
MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius'
espero que mi pregunta tiene sentido! ¿Cómo puedo mejorar esta operación básica de inserción si no se encuentra o actualización si se encuentra tan a menudo? ¡Gracias por cualquier ayuda!