我一直想知道如何从数据库中选择多行,并且它们的一个或多个列是即时更新的。让我们以搜索引擎为例,它会抓取数千个结果并更新查看次数(使用单个查询)。
那可能吗?他们是否使用特殊的 SQL 功能来实现这一点?
PS:如果之前有人问过这个问题,请参考我,因为我没有找到相同的问题,如果它很蹩脚,我知道。
例如,如果您考虑 Google 是如何做到的,他们使用Bigtable(请参阅此问题进行讨论)我对它的内部工作原理一无所知,因此无法发表评论。
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