如何在数据库中保存每条记录的通话次数?

时间:2013-05-03 05:39:51

标签: sql database postgresql

例如,我想知道用户在数据库中搜索过的最流行的记录。

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

key - value - counter

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

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

2 个答案:

答案 0 :(得分:1)

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

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

通过制作UPDATE语句,您的触发器会被调用,这样您就可以添加代码来修改count列。

CREATE TRIGGER tafter AFTER INSERT OR DELETE ON tbl1 FOR EACH ROW UPDATE SET counter = counter + 1 where key = 'keyval';

答案 1 :(得分: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;