MySQL的触发器来删除旧的记录,并插入一个新(MySQL trigger to delete ol

2019-10-18 10:54发布

我有一个表,如下

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另一个表sda_user_eform_data_bckup。 我想存储在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 ;

我无法找出触发了问题作为其不执行。 任何的建议是非常欢迎的。

提前致谢。

Answer 1:

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

create
  trigger 'copy_eform_data'

随着单引号copy_eform_data是一个字符串。

看看这篇文章: 当使用单引号,双引号,反引号和?

你也应该对阅读了NEWOLD的触发关键字。 你的触发可能从来没有相匹配的行。

和这里

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 。 你可能想在该列的索引。



Answer 2:

我做您的查询的一些变化。 回复是否有帮助。

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开始



Answer 3:

我正在寻找一个解决方案,用于删除记录创建触发器,并在您的论坛来了。 不过,我知道这是在一年后和你最有可能解决这个问题,但我想尝试回答您的帖子。 我想你你的最终$$之前需要一个“如果终结”。

因此,这将是:

 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 ;


文章来源: MySQL trigger to delete old record and insert new one