我一直在想如何從數據庫中選擇多行,並且一個或多個列在運行中更新。例如,讓我們以搜索引擎爲例,其中抓取了數千個結果並更新了查看計數(使用單個查詢)。選擇和更新SQL表(一擊中)
這可能嗎?他們是否使用特殊的SQL功能來實現這一目標?
P.S .:如果這個問題之前已經問過,請參考我,因爲我還沒有找到一個相同的,如果它是跛腳,我知道。
我一直在想如何從數據庫中選擇多行,並且一個或多個列在運行中更新。例如,讓我們以搜索引擎爲例,其中抓取了數千個結果並更新了查看計數(使用單個查詢)。選擇和更新SQL表(一擊中)
這可能嗎?他們是否使用特殊的SQL功能來實現這一目標?
P.S .:如果這個問題之前已經問過,請參考我,因爲我還沒有找到一個相同的,如果它是跛腳,我知道。
如果你考慮,例如,谷歌是怎麼做的,他們使用Bigtable的(見this question討論)我不知道它是如何工作的內部事情,所以不能評論。
至於你的問題,不可能一次完成select
和update
- 在純SQL中,也就是說。但是,可以使用存儲的函數執行此操作。考慮下面的函數(僞代碼)
create function select_and_update(criteria) returns setof data_rows
as
begin
update some_table set view_count = view_count + 1 where criteria;
return set "select * from some_table where criteria";
end;
然後在應用程序中,你可以做一個數據庫調用:
SELECT * FROM select_and_update(criteria)
這樣,只有一個從應用程序「打」(即您只針對數據庫連接執行應用程序中的一個查詢),但內部查看計數會更新並返回數據。
具體情況當然取決於數據庫引擎和您的特定需求,但我確實在我的網站中廣泛使用了這種技術。
如果我正確理解你的問題,爲什麼不是join
這兩個表?這樣的事情,
UPDATE table1 t1
INNER JOIN
(
SELECT id, count(*) totalCount
FROM tableName
GROUP BY id
) t2
ON t1.id = t2.id
SET t1.col1 = t2.totalCount
我不認爲它會達到OP的效果。他想運行更新並返回一組行 - 全部在一個數據庫調用中。 –
@AleksG也許,但我正在考慮這個'從數據庫中選擇,並且它們的一列或多列在即時更新。' –
我想你也可以用你的方式解釋它。很公平。 –
假設數據存儲在關係數據庫中,答案是檢索不是通過單個選擇。我可以想到兩種方法。
TYhe首先是通過存儲過程或表值用戶定義函數進行檢索。代碼將獲取結果並執行更新,然後返回結果。
或者,檢索可以使用遊標。一種類型的遊標是可更新的遊標,它允許調用者在一次調用中讀取和更新數據。可更新的遊標通常比較慢,所以它們用得不多。
「SELECT」和「UPDATE」有什麼問題? – eggyal
搜索引擎不使用SQL(通常);他們使用特定於文本的(並且在某些情況下,高度自定義的)索引引擎,它們可以執行您所描述的內容。 – antlersoft
@eggyal,我沒有說這是'錯誤的',我只是想了解更多關於數據庫和'東西'的信息。 – Smokie