我有一个表,如下
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 ;
我无法找出触发了问题作为其不执行。 任何的建议是非常欢迎的。
提前致谢。
这很可能是因为您的触发甚至不存在。 问题就在这里
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
。 你可能想在该列的索引。
我做您的查询的一些变化。 回复是否有帮助。
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开始
我正在寻找一个解决方案,用于删除记录创建触发器,并在您的论坛来了。 不过,我知道这是在一年后和你最有可能解决这个问题,但我想尝试回答您的帖子。 我想你你的最终$$之前需要一个“如果终结”。
因此,这将是:
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 ;