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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top