Comment effectuer un UPSERT efficace avec plusieurs colonnes
L'insertion ou la mise à jour de données dans une table de base de données à l'aide d'UPSERT (insertion en cas de mise à jour en double) peut être une tâche commune. Cependant, lorsque vous travaillez avec plusieurs colonnes dans une instruction de mise à jour, il est important de prendre en compte les performances et la maintenabilité.
Gestion de plusieurs colonnes dans un UPSERT
Dans votre exemple, vous visez pour insérer ou mettre à jour une ligne dans la table des articles, en incrémentant la valeur items_in_stock si la ligne existe. Bien que votre approche initiale utilisant une sous-requête dans la partie mise à jour puisse sembler logique, elle introduit une complexité inutile.
Préférer les instructions de mise à jour concises
Une meilleure approche consiste à éviter les sous-requêtes dans la déclaration de mise à jour. Utilisez plutôt la capacité de MySQL à référencer les anciennes et les nouvelles valeurs des colonnes mises à jour. Cela vous permet d'écrire des instructions de mise à jour concises et efficaces.
Exemple utilisant le référencement de valeur de MySQL
Considérez l'instruction UPSERT suivante :
INSERT INTO `item` (`item_name`, `items_in_stock`) VALUES( 'A', 27) ON DUPLICATE KEY UPDATE `items_in_stock` = `items_in_stock` + 27;
Dans Dans cet exemple, la valeur items_in_stock est mise à jour en ajoutant la nouvelle valeur items_in_stock à la précédente. MySQL référence automatiquement l'ancienne valeur items_in_stock, éliminant ainsi le besoin d'une sous-requête.
Avantages de cette approche :
Toujours considérer Simplicité
N'oubliez pas que les solutions les plus efficaces sont souvent les plus simples. Si vous compliquez trop un problème, il est probable que vous adoptiez la mauvaise approche. Adoptez la simplicité et recherchez des solutions efficaces et maintenables pour vos opérations de base de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!