Sql 如何在数据库中保存每条记录的调用数?

Sql 如何在数据库中保存每条记录的调用数?,sql,database,postgresql,Sql,Database,Postgresql,例如,我想随时知道用户在数据库中搜索的最流行的记录 我希望对于每条记录,我需要引入一个新的数字字段。因此,记录如下: key - value - counter 如何在数据库中增加计数器的值 我认为这有点像在查询时调用存储过程,但我不确定。也许问题很简单,我只是一个初学者,对此我深表歉意。你应该使用触发器。触发器是在每次执行INSERT、UPDATE或DELETE语句时对事件执行的命令,即使它们的调用没有修改任何记录。因此,在选择(读取)记录时,不能直接创建触发器来更新该记录的计数字段 但是,

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

我希望对于每条记录,我需要引入一个新的数字字段。因此,记录如下:

key - value - counter
如何在数据库中增加计数器的值


我认为这有点像在查询时调用存储过程,但我不确定。也许问题很简单,我只是一个初学者,对此我深表歉意。

你应该使用触发器。触发器是在每次执行
INSERT
UPDATE
DELETE
语句时对事件执行的命令,即使它们的调用没有修改任何记录。因此,在
选择(读取)记录时,不能直接创建触发器来更新该记录的
计数
字段

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

通过执行
UPDATE
语句,将调用触发器,这样您就可以添加代码来修改
count

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

首先,这听起来像是一个可怕的性能问题。每次选择一条记录时,如果要用一个数字跟踪选择,则必须对其进行更新,该数字仅存储总选择数,否则必须将时间戳值插入另一个表中,以便在读取行时进行分析

无论如何,您可以使用一个公共表表达式来实现这一点,在该表达式中,您可以更新表中的计数器,并将结果返回到主查询:

代码如下:

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;

最常见的搜索(或搜索关键字)或最常见的结果?@user2246674最常见的结果确切地说,触发器(特殊类型的存储过程)是您所需要的,这就是实现它的方法。因此,如果有人从my_表中选择*,您希望每个记录都有一个计数器递增?@David Aldridge是的,结果中的每个记录都递增。为什么SELECT没有触发器?OP用postgresql标记了他的帖子。