Domanda

Devo selezionare i dati quando viene visualizzata una pagina e aggiornare la colonna "visualizzazioni". Esiste un modo per farlo in una query o devo utilizzare query distinte?

È stato utile?

Soluzione

Se non si desidera/è necessario utilizzare una transazione, è possibile creare una procedura memorizzata che prima aggiorna il conteggio delle visualizzazioni, quindi seleziona i valori e li restituisce all'utente.

Altri suggerimenti

Dovresti farlo in due istruzioni in un'unica transazione

Begin Tran

Update Pages Set Views = Views + 1 Where ID = @ID
Select Columns From Pages Where ID = @ID

Commit Tran

Aiuterebbe se hai elencato l'RDBMS che stai utilizzando SQL Server ha l'istruzione output

Esempio

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 AGGIORNAMENTO l'istruzione ha la clausola RETURNING che restituirà un set di risultati come un'istruzione SELECT:

UPDATE mytable
 SET views = 5
 WHERE id = 16
 RETURNING id, views, othercolumn;

Sono abbastanza sicuro che questo non sia standard però.Non so se altri database lo implementano.

Modificare:Ho appena notato che la tua domanda ha il tag "MySQL".Forse dovresti menzionarlo nella domanda stessa.Tuttavia è una buona domanda generica sul database: mi piacerebbe vedere come farlo in altri database.

Ho usato questo trucco con Java e SQL Server ti consentirà anche di inviare due comandi in un unico PreparedStatement.

update tablex set y=z where a=b \r\n select a,b,y,z from tablex

Tuttavia, questo dovrà essere in una transazione con impegno di lettura per funzionare come pensi che dovrebbe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top