Molto spesso, voglio eseguire una query su uno dei miei utenti dove voglio una fila memorizzato e associato a tale utente, in una relazione 1 a 1. Quindi diciamo (questo è solo un esempio arbitrario), che ho un tavolo che tiene traccia della macchina di un utente, insieme ad alcune informazioni sulla macchina. Ogni utente può avere 0 o 1 auto. Se l'utente non ha una macchina, non vi è alcuna voce nella tabella per quell'utente. tavoloMySQL modo "buono" per inserire una riga, se non trovato, o aggiornare, se si trova
auto (di nuovo, solo un esempio): id, user_id, car_make, car_model
Così, quando aggiorno questo tavolo, finisco sempre per fare qualcosa di simile (pseudo-codice):
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')
}
Come posso fare questo in una dichiarazione elegante che funziona "atomico"? Cosa succede se, in un altro processo, la riga viene RIMOSSA tra le istruzioni SELECT e UPDATE? La mia istruzione UPDATE fallirà dove dovrebbe essere eseguita la dichiarazione INSERT. E mi sento come se avessi bisogno di fare due dichiarazioni simili (ma diverse) per realizzare la stessa cosa! Quello di cui ho bisogno è una dichiarazione che mi assicuri che i dati che voglio siano presenti nella tabella, specialmente quando voglio solo una riga che soddisfi il mio requisito. Per esempio, potrebbe essere qualcosa di simile (questo è totalmente inventata ovviamente):
MAKE SURE A ROW IN cars WHERE user_id=5 IS SET WITH car_make='toyota', car_model='prius'
In questo modo, se user_id 5 esiste già, sarà aggiornato, in caso contrario, verrà inserito. Inoltre, se ho cambiato i requisiti, ad esempio per dire che ogni utente può avere zero o un'auto di un dato car_make, quindi ho potuto inoltre precisare che:
MAKE SURE A ROW IN cars WHERE user_id=5 AND car_make='toyota' IS SET WITH car_model='prius'
Spero che la mia domanda ha un senso! Come posso migliorare questa operazione di inserimento, se non trovata o aggiornamento-se-trovata di base che viene visualizzata così spesso? Grazie per qualsiasi aiuto!