Могу ли я обновить / выбрать из таблицы в одном запросе?

StackOverflow https://stackoverflow.com/questions/43644

  •  09-06-2019
  •  | 
  •  

Вопрос

Мне нужно выбрать данные при просмотре страницы и обновить столбец "просмотры" есть ли способ сделать это в одном запросе, или я должен использовать для разных запросов?

Это было полезно?

Решение

Если вы не хотите / не нуждаетесь в использовании транзакции, вы могли бы создать хранимую процедуру, которая сначала обновляет количество просмотров, а затем выбирает значения и возвращает их пользователю.

Другие советы

Вам пришлось бы сделать это в двух операторах в одной транзакции

Begin Tran

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

Commit Tran

Было бы полезно, если бы вы перечислили используемые вами СУБД SQL Server имеет инструкцию OUTPUT

Пример

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's Обновить оператор содержит предложение RETURNING, которое вернет результирующий набор, подобный оператору SELECT:

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

Хотя я почти уверен, что это не стандартно.Я не знаю, реализуют ли это какие-либо другие базы данных.

Редактировать:Я только что заметил, что в вашем вопросе есть тег "MySQL".Возможно, вам следует упомянуть об этом в самом вопросе.Однако это хороший общий вопрос о базе данных - я хотел бы посмотреть, как это сделать в других базах данных.

Я использовал этот трюк с Java, и SQL Server также позволит вам отправлять две команды в одном PreparedStatement.

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

Однако это должно быть в транзакции с фиксацией чтения, чтобы работать так, как вы считаете нужным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top