Puis-je mettre à jour/sélectionner une table en une seule requête ?
-
09-06-2019 - |
Question
Je dois sélectionner des données lorsqu'une page est consultée et mettre à jour la colonne « Vues ». Existe-t-il un moyen de le faire en une seule requête, ou dois-je utiliser des requêtes distinctes ?
La solution
Si vous ne souhaitez pas/n'avez pas besoin d'utiliser une transaction, vous pouvez créer une procédure stockée qui met d'abord à jour le nombre de vues, puis sélectionne les valeurs et les renvoie à l'utilisateur.
Autres conseils
Vous devrez le faire en deux déclarations en une seule transaction
Begin Tran
Update Pages Set Views = Views + 1 Where ID = @ID
Select Columns From Pages Where ID = @ID
Commit Tran
Cela aiderait si vous répertoriez le SGBDR que vous utilisez SQL Server a l'instruction de sortie
Exemple
USE AdventureWorks;
GO
DECLARE @MyTestVar table (
OldScrapReasonID int NOT NULL,
NewScrapReasonID int NOT NULL,
WorkOrderID int NOT NULL,
ProductID int NOT NULL,
ProductName nvarchar(50)NOT NULL);
UPDATE Production.WorkOrder
SET ScrapReasonID = 4
OUTPUT DELETED.ScrapReasonID,
INSERTED.ScrapReasonID,
INSERTED.WorkOrderID,
INSERTED.ProductID,
p.Name
INTO @MyTestVar
FROM Production.WorkOrder AS wo
INNER JOIN Production.Product AS p
ON wo.ProductID = p.ProductID
AND wo.ScrapReasonID= 16
AND p.ProductID = 733;
SELECT OldScrapReasonID, NewScrapReasonID, WorkOrderID,
ProductID, ProductName
FROM @MyTestVar;
GO
PostgreSQL MISE À JOUR L'instruction contient la clause RETURNING qui renverra un ensemble de résultats comme une instruction SELECT :
UPDATE mytable
SET views = 5
WHERE id = 16
RETURNING id, views, othercolumn;
Je suis presque sûr que ce n'est pas standard.Je ne sais pas si d'autres bases de données l'implémentent.
Modifier:Je viens de remarquer que votre question comporte la balise "MySQL".Peut-être devriez-vous le mentionner dans la question elle-même.C'est cependant une bonne question générique sur la base de données - j'aimerais voir comment le faire dans d'autres bases de données.
J'ai utilisé cette astuce avec Java et SQL Server vous permettra également d'envoyer deux commandes dans un seul PreparedStatement.
update tablex set y=z where a=b \r\n select a,b,y,z from tablex
Cela devra être dans une transaction de lecture validée pour fonctionner comme vous le pensez.