【MySQL】MySQL作成トリガおよび関連資料

3767 ワード

MySqlフリップフロップとは、テーブルに何らかのアクションが発生すると、フリップフロップで定義されたアクションが発生することを意味します.これらの操作は、次のいずれかです.
INSERT:テーブルのコンテンツにコンテンツが挿入されると定義されたトリガがトリガーされ、beforとafterの2つのイベントがあります.
UPDATE:テーブルのレコードが更新されると定義されたトリガがトリガーされ、beforとafterの2つのイベントがあります.
DELETE:テーブルのレコードが削除されたときに定義されたトリガがトリガーされます.しかし、DROP TABLEとTRUNCATE TABLEを使用すると、delete関数を使用して動作していないため、トリガはトリガーされません.参考資料の3つの操作の違いを見てください.
標準の作成トリガ構文は次のとおりです.
CREATE
    [DEFINER = { user | CURRENT_USER }] #     ,        
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_body

例:
mysql> delimiter $$
mysql> create trigger my_test_trigger after DELETE on my_tst
    -> for each row
    -> begin
    -> delete from foreign_test where foreign_test.mytest_id = OLD.id;
    -> END
    -> $$ 
 mysql> delimiter $$;

上記の例では、my-testテーブルの内容を削除するときにforeign_を自動的に削除する削除トリガを作成しました.testテーブルの内容.foreign_testの一列mytest_idはmy_testのプライマリ・キーは、外部キーではないことに注意してください.ここでは定義された外部キーは表示されません.
トリガを定義する上で注意すべき点は、次のとおりです.
1:delimiter $$; その役割は、その文の後にすべてのmysqlが認識できるセミコロン機能を取り消すことであり、実際には通常のプログラミング言語のエスケープ子である.トリガには必ずsql文があるので、sql文はセミコロンで終わる必要があります.セミコロンを使用してmysqlをトリガの内容ではなく、今回のsql文の終わりとして使用すると、構文エラーが発生します.
2:エスケープ文字を使用している以上、エスケープの終了位置を宣言しなければならないので、END後の2ドル記号があります.また、エスケープを解除するためには、mysql>delimiter$$という明示的な接触文が必要です.
最後にインデックス作成に使用するOLDについて.idは相応の解釈を行う:
またOLDと同じ場合のキーワードNEWもあります.OLDとNEWがサイズに敏感でない場合、トリガによって影響されるカラムを参照する役割を果たします.
挿入により作成するフリップフロップではNEWしか使用できない.col_nameは、挿入される前は古いカラムが存在しなかったためです.
削除にはOLDしか使用できません.col_name,例えば面の例では,新しい列は生成されないので,新しい列への参照は語れない.
更新操作が少し面倒なので、OLDを使うことができます.col_nameは更新前のレコードを参照し、NEWを使用することもできる.col_nameは更新後のレコードを参照します.実は性質は同じだと思いますが、具体的な効果は確認されていません.ご覧のように、状況に応じてテストして使用してください.
現在のトリガshow triggersを表示します.
削除トリガはDROP TRIGGER trigger_name;
参考資料:
相違点:1.truncateとdeleteは、データのみを削除し、テーブルの構造(定義)drop文は、テーブル全体の使用情報を削除します.テーブルの構造、依存制約(constrain)、トリガ(trigger)、インデックス(index)を含む.このテーブルに依存するストアド・プロシージャ/関数は保持するがinvalid状態となる.2.delete文はdmlで、この操作はrollback segementに配置され、トランザクションがコミットされてから有効になります.対応するtriggerがある場合、実行時にトリガーされます.truncate,dropはddlであり、操作は直ちに発効し、元のデータはrollback segmentに置かず、ロールバックできない.操作はtriggerをトリガーしない.3.delete文は表が占有するextentに影響しない.高水線(high watermark)は元の位置を維持している.明らかにdrop文は表が占有する空間をすべてtruncate文を解放する.デフォルトでは、reuse storageを使用しない限り、minextents個のextentに空間を解放する.truncateは高水線をリセットする(最初に戻る).4.速度、一般的にはdrop>truncate>delete
すべてのデータを削除するtruncateとdeleteでは、テーブルのすべてのデータを削除すると、truncateは実際にはテーブル全体を削除して再構築しますが、deleteでは1行1行の削除であり、削除時にロックを競合するに違いありませんので、遅いです.5.セキュリティ:dropとtruncateを注意深く使用し、特にバックアップがない場合.さもないと泣いても間に合わない.使用上、一部のデータ行を削除するにはdeleteを使用し、where句を付けることに注意する.ロールバックセグメントは十分大きい.テーブルを削除するには、もちろんdropでテーブルを保持するためにすべてのデータを削除する.トランザクションに関係ない場合はtruncateを使用します.トランザクションに関連する場合、triggerをトリガーしたい場合はdelete.テーブル内部のフラグメントを整理する場合は、truncateでreuse stroageに従い、データのインポート/挿入を再開できます.