1

私は以下のようなテーブルを持っています

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 より大きい場合は常に、古い値を 2 番目の (sda_user_eform_data_bckup) テーブルに移動する必要があります。

最初に、sda_user_eform_data テーブルのすべての行を sda_user_eform_data_bckup テーブルにコピーしました。次に、ack_no をチェックした次のトリガーを作成しました。5 より大きい場合は、最も古い ack_no を削除し、新しい値をバックアップ テーブルに挿入します。

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 ;

トリガーが実行されていないため、どこでトリガーが失敗したかを見つけることができません。どんな提案でも大歓迎です。

前もって感謝します。

4

3 に答える 3

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 から始まることを確認してください。

于 2013-07-31T09:04:21.253 に答える
0

これは、トリガーが存在しないためである可能性が最も高いです。問題はここにあります

create
  trigger 'copy_eform_data'

一重引用符copy_eform_dataは文字列です。

この投稿をご覧ください:一重引用符、二重引用符、およびバッククォートを使用する場合は?

また、トリガーのNEWandキーワードについても読む必要があります。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。そして、おそらくその列にインデックスが必要です。

于 2013-07-31T08:42:03.060 に答える
0

レコードを削除するためのトリガーを作成するソリューションを探していたところ、あなたのフォーラムに出会いました。ただし、これは 1 年以上の投稿であり、問​​題を解決した可能性が高いことは承知していますが、投稿に回答したいと思います。終了$$の前に「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 ;
于 2014-08-14T18:56:29.053 に答える