我一直想知道如何从数据库中选择多行,并且他们的一列或多列都是即时更新的。让我们以搜索引擎为例,其中抓取了数千个结果并更新了视图计数(使用单个查询)。
这可能吗?他们是否使用特殊的SQL功能来实现这一目标?
P.S。:如果之前已经问过这个问题请转介我,因为我没有找到相同的问题,如果它是蹩脚的,我知道。
答案 0 :(得分:2)
例如,如果您考虑Google如何做到这一点,他们会使用 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)
这样,应用程序中只有一个“命中”(即您只是针对数据库连接从应用程序执行一个查询),但是内部视图计数会更新并返回数据。
具体而言,具体取决于数据库引擎和您的特定需求,但我确实在我的网站上广泛使用了这种技术。
答案 1 :(得分:1)
假设数据存储在关系数据库中,答案是检索不是通过单个选择。我可以想到两种方法。
TYhe首先通过存储过程或表值用户定义函数进行检索。代码将获取结果并执行更新,然后返回结果。
或者,检索可以使用游标。一种类型的游标是可更新的游标,它允许调用者在一次调用中读取和更新数据。可更新游标通常很慢,所以它们使用不多。
答案 2 :(得分: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