2013-07-31 3 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_bckup, которая имеет точно такую ​​же структуру, как и sda_user_eform_data. Я хочу сохранить только 5 строк (последние строки) в sda_user_eform_data и всякий раз, когда 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?

Также вы должны дочитать о 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. И вам, вероятно, нужен индекс в этом столбце.

+0

спасибо за ваш ответ, я пытался без кавычек. но он дает следующую ошибку: 'В СИНХРОННОЙ триггере нет СТАРШЕЙ строки.' – 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 ; 
Смежные вопросы