J'ai une table Commandes qui a une colonne Quantité. Lors de l'enregistrement ou du départ, nous devons mettre à jour cette colonne Quantité par un. Y a-t-il un moyen de le faire en une seule action ou nous devons obtenir la valeur existante et ensuite en ajouter ou en réduire une?
Une autre question est lorsque nous insérons une nouvelle ligne, devons-nous vérifier si les mêmes données existent, puis insérer sinon, ce qui est en deux étapes, ou y a-t-il une meilleure façon de le faire?
Merci,
La réponse en une seule étape à la première question est d'utiliser quelque chose comme:
C'est en grande partie une manière à instruction unique de le faire.
En ce qui concerne la deuxième question, vous ne devriez pas avoir besoin de recourir à la gymnastique SQL spécifique au SGBD (comme
UPSERT
) pour obtenir le résultat souhaité. Il existe une méthode standard pour effectuer une mise à jour ou une insertion qui ne nécessite pas de SGBD spécifique.Autrement dit, vous essayez de faire la création en premier. S'il est déjà là, ignorez l'erreur. Sinon, vous le créez avec une valeur 0.
Ensuite, faites la mise à jour qui fonctionnera correctement que ce soit ou non:
Ce n'est pas une seule instruction et pourtant, assez étonnamment, c'est la façon dont nous le faisons avec succès depuis longtemps.
la source
Si ma compréhension est correcte, les mises à jour devraient être assez simples. Je ferais juste ce qui suit.
Vous aurez peut-être besoin de filtres supplémentaires pour ne mettre à jour qu'une seule ligne au lieu de toutes les lignes.
Pour les insertions, vous pouvez mettre en cache localement un identifiant unique lié à votre enregistrement et vérifier par rapport à ce cache et décider de l'insérer ou non. L'approche alternative consiste à toujours insérer et vérifier l'erreur de violation PK et à l'ignorer car il s'agit d'une insertion redondante.
la source
Autant que je sache, il n'y a pas de support intégré pour INSERT-OR-UPDATE dans SQL. Je suggère de créer une procédure stockée ou d'utiliser une requête conditionnelle pour y parvenir. Ici vous trouverez une collection de solutions pour différentes bases de données.
la source
pour répondre à la seconde:
rendez la colonne unique et interceptez l'exception si elle est définie sur la même valeur.
la source
@dotjoe Il est moins coûteux de mettre à jour et de vérifier @@ rowcount, faire une insertion après coup.
Les exceptions sont chères et les mises à jour sont plus fréquentes
Suggestion: Si vous voulez être ultra performant dans votre DAL, faites passer le frontal dans un ID unique pour la ligne à mettre à jour, si l'insertion est nulle.
Les DAL doivent être CRUD et ne pas avoir à craindre d'être apatrides.
Si vous le rendez sans état, avec de bons index, vous ne verrez pas de différence avec l'instruction SQL vs 1 suivante. IF (sélectionnez top 1 * form x où PK = @ ID) Insérer autre mise à jour
la source