1

我有一张如下表

Table name: sda_user_eform_data

ack_no   Name       Description
1        name1     This is name1
2        name2     This is name2
3        name3     This is name3

我有另一个表 sda_user_eform_data_bckup,它的结构与 sda_user_eform_data 完全相同。我只想在 sda_user_eform_data 中存储 5 行(最新行),并且只要 ackno 大于 5,就应该将旧值移动到第二个(sda_user_eform_data_bckup)表中。

为此,我首先将 sda_user_eform_data 表中的所有行复制到 sda_user_eform_data_bckup 表中。然后我创建了以下触发器,其中我检查了 ack_no,如果它大于 5,则删除最旧的 ack_no 并将新值插入 bckup 表。

DELIMITER $$
create
  trigger 'copy_eform_data' AFTER INSERT
  on asdb.sda_user_eform_data
  for each row begin
  if (select count(s.ack_no) from asdb.sda_user_eform_data s)>5 then
    delete from asdb.sda_user_eform_data where old.ack_no=(select min(s.ack_no) from asdb.sda_user_eform_data s);
  insert into asdb.sda_user_eform_data_bckup select * from asdb.sda_user_eform_data where ack_no=select max(s.ack_no) from asdb.sda_user_eform_data s;
end$$
DELIMITER ;

我无法找出触发器在哪里出错,因为它没有执行。任何建议都非常受欢迎。

提前致谢。

4

3 回答 3

0

我对您的查询进行了一些更改。如果有帮助,请恢复。

DELIMITER $$
create
  trigger 'copy_eform_data' AFTER INSERT
  on asdb.sda_user_eform_data
  for each row begin
  insert into asdb.sda_user_eform_data_bckup 
   select * from asdb.sda_user_eform_data ORDER BY ack_no DESC LIMIT 1
  if (select count(s.ack_no) from asdb.sda_user_eform_data s)>=5 then
    delete from asdb.sda_user_eform_data;  
end$$
DELIMITER ;

但请确保在清除表后将记录输入“asdb.sda_user_eform_data”时,“ack_no”应再次从 1 开始

于 2013-07-31T09:04:21.253 回答
0

我正在寻找一种解决方案来创建删除记录的触发器并遇到了您的论坛。但是,我知道这是一年多的帖子,您很可能已经解决了这个问题,但我想尝试回答您的帖子。我认为您在结束 $$ 之前需要一个“End If”。

所以它会是:

 DELIMITER $$
create
 trigger 'copy_eform_data' AFTER INSERT
 on asdb.sda_user_eform_data
 for each row begin
 if (select count(s.ack_no) from asdb.sda_user_eform_data s)>5 then
 delete from asdb.sda_user_eform_data where old.ack_no=(select min(s.ack_no) from  asdb.sda_user_eform_data s);
 insert into asdb.sda_user_eform_data_bckup select * from asdb.sda_user_eform_data where ack_no=select max(s.ack_no) from asdb.sda_user_eform_data s;
END IF;
end$$
DELIMITER ;
于 2014-08-14T18:56:29.053 回答
0

这很可能是因为您的触发器甚至不存在。问题就在这里

create
  trigger 'copy_eform_data'

带单引号copy_eform_data的是一个字符串。

看看这篇文章:何时使用单引号、双引号和反引号?

此外,您应该阅读有关触发器中的NEW和关键字的信息。OLD您的触发器可能永远不会匹配一行。

和这里

where ack_no=select max(s.ack_no) from asdb.sda_user_eform_data s

你缺少括号。

除此之外,老实说,我对你的逻辑并没有深入思考,因为我在你的整个问题中都没有看到任何意义。为什么要拥有重复数据?我猜是出于性能原因?让你的表适当地索引,应该没有问题。要获得表的 5 个最新条目,只需使用

FROM yourTable
ORDER BY when_was_the_entry_created_or_something DESC 
LIMIT 5

你可以有像这样的列

created timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

在你的ORDER BY. 您可能希望在该列上有一个索引。

于 2013-07-31T08:42:03.060 回答