0

例如,我想随时了解用户在数据库中搜索的最热门记录。

我希望对于每条记录,我都需要引入一个新的数字字段。因此,记录将是这样的:

key - value - counter

如何增加数据库中计数器的值?

我认为这就像在查询时调用存储过程,但我不确定。也许这个问题很简单,我只是一个初学者,在这种情况下我很抱歉。

4

2 回答 2

1

首先,这听起来像是一个可怕的性能问题。每次选择记录时,如果您使用单个数字跟踪选择,则必须更新它,该数字仅存储总选择,否则您必须将带时间戳的值插入另一个表才能分析何时读取行。

无论如何,您可以使用通用表表达式执行此操作,在该表达式中更新表中的计数器并将结果返回到主查询:http ://sqlfiddle.com/#!1/1aa41/6

代码如下:

create table my_table(col1 varchar(30), col2 numeric, select_count numeric);

insert into my_table values ('A',1,0);
insert into my_table values ('B',2,0);
insert into my_table values ('C',3,0);
insert into my_table values ('D',4,0);
insert into my_table values ('E',5,0);

with upd as (
  update    my_table
  set       select_count = select_count+1
  where     col1 = 'A'
  returning *)
select *
from   upd;

with upd as (
  update    my_table
  set       select_count = select_count+1
  where     col1 = 'B'
  returning *)
select *
from   upd;

with upd as (
  update    my_table
  set       select_count = select_count+1
  where     col1 = 'A'
  returning *)
select *
from   upd;

with upd as (
  update    my_table
  set       select_count = select_count+1
  returning *)
select count(*)
from   upd;

with upd as (
  update    my_table
  set       select_count = select_count+1
  returning *)
select sum(col2)
from   upd;

with upd as (
  update    my_table
  set       select_count = select_count+1
  returning *)
select *
from   upd;
于 2013-05-03T08:06:30.520 回答
1

您应该为此使用触发器。触发器是在事件上执行的命令,每次执行或语句时INSERT,即使它们的调用不修改任何记录。因此,当您(读取)记录时,您无法直接创建用于更新记录字段的触发器。UPDATEDELETEcountSELECT

但是,您可以尝试一种解决方法,其中您的表中也有一个日期字段,并在每次调用记录时更新它。使用您的应用程序将此日期时间值发送到数据库,这将触发UPDATE.

通过UPDATE声明,您的触发器被调用,这样您就可以添加代码来修改count列。

CREATE TRIGGER tafter AFTER INSERT OR DELETE ON tbl1 FOR EACH ROW UPDATE SET counter = counter + 1 where key = 'keyval';
于 2013-05-03T06:05:06.490 回答