MySQL触发删除旧记录并插入新记录

时间:2013-07-31 07:00:50

标签: mysql sql triggers

我有一张表格如下

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 ;

由于没有执行,我无法找出触发器出错的位置。任何建议都非常欢迎。

提前致谢。

3 个答案:

答案 0 :(得分:0)

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

create
  trigger 'copy_eform_data'

单引号copy_eform_data是一个字符串。

看一下这篇文章:When to use single quotes, double quotes, and backticks?

另外,您应该了解触发器中的NEWOLD个关键字。你的触发器可能永远不会匹配一条线。

在这里

where ack_no=select max(s.ack_no) from asdb.sda_user_eform_data s
你错过了parantheses。

除此之外,我并没有真正深入考虑你的逻辑,因为我没有在你的整个问题中看到一点。为什么要重复数据?我猜出了性能原因?让你的表索引适当,应该没有问题。要获得表格的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中使用。你可能想要该列的索引。

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

答案 2 :(得分:0)

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

所以它会是:

 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 ;