我有一张表格如下
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 ;
由于没有执行,我无法找出触发器出错的位置。任何建议都非常欢迎。
提前致谢。
答案 0 :(得分:0)
这很可能是因为您的触发器甚至不存在。问题出在这里
create
trigger 'copy_eform_data'
单引号copy_eform_data
是一个字符串。
看一下这篇文章:When to use single quotes, double quotes, and backticks?
另外,您应该了解触发器中的NEW
和OLD
个关键字。你的触发器可能永远不会匹配一条线。
在这里
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 ;