Souvent, je veux ajouter une valeur à une table ou mettre à jour la valeur si sa clé existe déjà. Cela peut se faire de plusieurs façons, en supposant une clé primaire ou unique est fixé sur les colonnes « user_id » et « pref_key » dans l'exemple:Y at-il un inconvénient à utiliser aveuglément INSERT dans MySQL?
1. Insérez aveugle, mise à jour en cas de réception d'une clé doublon:
// Try to insert as a new value
INSERT INTO my_prefs
(user_id, pref_key, pref_value)
VALUES (1234, 'show_help', 'true');
// If a duplicate-key error occurs run an update query
UPDATE my_prefs
SET pref_value = 'true'
WHERE user_id=1234 AND pref_key='show_help';
2. Vérifier l'existence, puis sélectionnez ou mise à jour:
// Check for existence
SELECT COUNT(*)
FROM my_prefs
WHERE user_id=1234 AND pref_key='show_help';
// If count is zero, insert
INSERT INTO my_prefs
(user_id, pref_key, pref_value)
VALUES (1234, 'show_help', 'true');
// If count is one, update
UPDATE my_prefs
SET pref_value = 'true'
WHERE user_id=1234 AND pref_key='show_help';
La première semble être préférable car il faudra qu'une seule requête pour n ew inserts et deux pour une mise à jour, où la deuxième manière nécessitera toujours deux requêtes. Y a-t-il quelque chose qui me manque mais qui ferait une mauvaise idée d'insérer aveuglément?
Peut-être dans Ruby, mais ce n'est pas vrai dans une base de données. Le surcoût de la vérification dans une table n'est pas comme le coût de la vérification d'un objet en mémoire. Vous êtes en train d'appliquer des normes pour votre langue à une base de données. Les gens de base de données ont la norme contraire pour une raison, il fonctionne beaucoup mieux. –
Ce n'est pas rare. Plus j'en apprends sur le serveur SQL, plus je me rends compte que ma norme pour mon code Oracle serait une idée horrible pour le code SQL Server. Ce n'est pas parce que cela s'applique à un endroit que c'est une bonne idée partout. –