【问题标题】:track multiple identical entries跟踪多个相同的条目
【发布时间】:2011-10-16 16:06:48
【问题描述】:

我有一个表,我允许相同的条目(重复、三重等),但我也有一个列,我希望每次创建一个条目时都会更新该条目存在的次数。

所以我想写一个触发器,我已经可以通过这样做找到重复的条目

select count(pid) from items group by pid having count(*);

但问题是这个查询返回的列比原始表少(因为有很多重复)

所以查询和表之间没有一对一的关系,所以我可以使用更新。我怎样才能修改它以获得所需的结果

先谢谢你了。

【问题讨论】:

  • 为什么需要额外的列?当您需要这些信息时,您可以不按 pid 进行计数吗?
  • 因为有数千个条目,并且越来越多的条目不断添加,当有人查看某些条目时,它通常是一百个左右......所以我不能运行相同的查询数百次。它不实用

标签: mysql


【解决方案1】:

您将面临的主要问题是 MySQL 不允许您在修改 AFTER INSERT ... 表本身之后使用 AFTER INSERT ... 触发器修改 items 表(想想这会如何导致循环引用)。

一种解决方案是将计数完全存储在单独的表中(例如items_pid_info)。该表的主键是pid,并且该表将由主项目表上的触发器更新。当您需要访问给定 pidpidCount 时,只需加入此表,您将获得给定 pid 的最新 pid 计数。因此:

create table items_pid_info    
(pid int unsigned not null primary key,
pidCount int unsigned not null);

现在在您的items 表上创建INSERTUPDATEDELETE 触发器以更新items_pid_info 表:

DELIMITER &&

CREATE TRIGGER items_pid_count_ins_trg
AFTER INSERT ON items

FOR EACH ROW BEGIN
DECLARE c int;

set c := (select count(*) from items im where im.pid = NEW.pid);

insert into items_pid_info values (NEW.pid,c) on duplicate key update pidCount = c;

END&&


CREATE TRIGGER items_pid_count_upd_trg
AFTER UPDATE ON items
FOR EACH ROW BEGIN

DECLARE c int;

set c := (select count(*) from items im where im.pid = NEW.pid);

insert into items_pid_info values (NEW.pid,c) on duplicate key update pidCount = c;
END&&


CREATE TRIGGER items_pid_count_del_trg
AFTER DELETE ON items
FOR EACH ROW BEGIN

DECLARE c int;

set c := (select count(*) from items im where im.pid = OLD.pid);

insert into items_pid_info values (OLD.pid,c) on duplicate key update pidCount = c;
END&&

DELIMITER ;

希望这会有所帮助。

【讨论】:

  • 帮助很大,我对 mysql 还很陌生,当我使用 oracle 时,我可以轻松地在同一张桌子上做到这一点(例如进行自动编号)谢谢
猜你喜欢
  • 1970-01-01
  • 2018-08-10
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
相关资源
最近更新 更多