2012-09-06 48 views
0

我一直在想如何從數據庫中選擇多行,並且一個或多個列在運行中更新。例如,讓我們以搜索引擎爲例,其中抓取了數千個結果並更新了查看計數(使用單個查詢)。選擇和更新SQL表(一擊中)

這可能嗎?他們是否使用特殊的SQL功能來實現這一目標?

P.S .:如果這個問題之前已經問過,請參考我,因爲我還沒有找到一個相同的,如果它是跛腳,我知道。

+0

「SELECT」和「UPDATE」有什麼問題? – eggyal

+1

搜索引擎不使用SQL(通常);他們使用特定於文本的(並且在某些情況下,高度自定義的)索引引擎,它們可以執行您所描述的內容。 – antlersoft

+0

@eggyal,我沒有說這是'錯誤的',我只是想了解更多關於數據庫和'東西'的信息。 – Smokie

回答

2

如果你考慮,例如,谷歌是怎麼做的,他們使用Bigtable的(見this question討論)我不知道它是如何工作的內部事情,所以不能評論。

至於你的問題,不可能一次完成selectupdate - 在純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) 

這樣,只有一個從應用程序「打」(即您只針對數據庫連接執行應用程序中的一個查詢),但內部查看計數會更新並返回數據。

具體情況當然取決於數據庫引擎和您的特定需求,但我確實在我的網站中廣泛使用了這種技術。

+1

'return set「...」'語法看起來不像有效的MySQL(用這個問題標記)。此外,在任何RDBMS中,這種方法幾乎肯定不是併發安全的 - 如果需要原子性,則應該使用事務。 – eggyal

+0

niec1上的Bigtable,謝謝。 – Smokie

+0

@Eggyal請注意,我說「僞代碼」 - 當然它不是MYSQL。當然,在生產中,我使用事務和適當的SQL(順便說一下,我的生產數據庫不是mysql)。例如,在postgres plpgsql中,您可以在存儲函數中使用語法'return query select * from some_table;'。 –

0

如果我正確理解你的問題,爲什麼不是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 
+0

我不認爲它會達到OP的效果。他想運行更新並返回一組行 - 全部在一個數據庫調用中。 –

+0

@AleksG也許,但我正在考慮這個'從數據庫中選擇,並且它們的一列或多列在即時更新。' –

+0

我想你也可以用你的方式解釋它。很公平。 –

1

假設數據存儲在關係數據庫中,答案是檢索不是通過單個選擇。我可以想到兩種方法。

TYhe首先是通過存儲過程或表值用戶定義函數進行檢索。代碼將獲取結果並執行更新,然後返回結果。

或者,檢索可以使用遊標。一種類型的遊標是可更新的遊標,它允許調用者在一次調用中讀取和更新數據。可更新的遊標通常比較慢,所以它們用得不多。