2013-07-31 115 views
1

我有一個表,如下MySQL的觸發器來刪除舊記錄,插入新的

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 ; 

我無法找到觸發器出錯的地方,因爲它沒有執行。任何建議都非常歡迎。

在此先感謝。

回答

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 

你缺少括號。除了所有這些,我並沒有真正對你的邏輯有深刻的思考,因爲我沒有看到你的整個問題中的一個觀點。爲什麼你想要重複的數據?我猜出於性能原因?讓表格適當地索引,應該沒有問題。並讓你的表的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使用。而且你可能需要在該列上的索引。

+0

感謝您的回覆,不包括引號。但它給出了以下錯誤: 'INSERT觸發器上沒有舊行。' – user2625279

+0

這就是爲什麼我說你應該閱讀它。錯誤信息很清楚,不是嗎? – fancyPants

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

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 ;