MYSQLトリガ(Trigger)


一、何のトリガ
トリガ(trigger)は、プログラムによって呼び出されるのではなく、手動で起動されるのではなく、テーブルを操作(insert,delete,update)すると実行がアクティブになるなど、特殊なストレージ・プロシージャです.トリガは、データの整合性制約やビジネス・ルールなどを強化するためによく使用されます.トリガはDBA_からTRIGGERS ,USER_TRIGGERSデータ辞書で調べました.
トリガには非常に良い特性があります.トリガは、参照整合性に違反する変更を禁止またはロールバックし、試行されたデータの変更を取り消すことができます.
どういう意味ですか.例を挙げて説明します.ストリートゲームはみんなやったことがありますね.一関を突破して、次の関を突破して、一関が突破していないのは第一関から始まります.トリガルートはこれに似ています.
トリガプログラムは単一の取引の一部とみなされるため、元のトリガプログラムによって取引を復元することができ、取引中に深刻なエラー(使用者が接続を中断するなど)を検出すると、自動的に取引全体を復元する.
彼の役割は明らかで、データの完全性を大切にすることができて、次の例は彼のメリットを説明して、そしてコードを書くのがそんなに複雑ではありませんならば
二、トリガ文法
CREATE TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt

トリガは、テーブルに関連する名前付きデータベース・オブジェクトであり、テーブルに特定のイベントが発生すると、オブジェクトがアクティブになります.
トリガと名前tbl_nameのテーブル関連.tbl_nameは永続テーブルを参照する必要があります.トリガをTEMPORARYテーブルまたはビューに関連付けることはできません.
trigger_timeはトリガプログラムの動作時間です.これはBEFOREまたはAFTERであり、トリガが文をアクティブにする前または後にトリガされることを示すことができる.
trigger_eventは、トリガをアクティブにする文のタイプを示します.trigger_イベントは、次のいずれかの値で指定できます.
・INSERT:テーブルに新しいローを挿入するときにトリガをアクティブにします.たとえば、INSERT、LOAD DATA、REPLACE文を使用します.
・UPDATE:ある行を変更したときにトリガーをアクティブにします.たとえば、UPDATE文を使用します.
・DELETE:テーブルからローを削除するとトリガーがアクティブになります.たとえば、DELETE文とREPLACE文を使用します.
注意してtrigger_eventは、トリガをテーブル操作でアクティブにするSQL文とあまり似ていないことが重要です.例えば、INSERTに関するBEFOREトリガは、INSERT文のみならず、LOAD DATA文によってもアクティブ化される.
紛らわしい例の一つはINSERT INTOです.ON DUPLICATE UPDATE…構文:BEFORE INSERTトリガは各行に対してアクティブになり、AFTER INSERTトリガ、またはBEFORE UPDATEとAFTER UPDATEトリガとなります.具体的には、行に重複キーがあるかどうかによって異なります.
同じトリガ動作時間とイベントを持つ所定のテーブルには、2つのトリガは使用できません.たとえば、あるテーブルに対して、BEFORE UPDATEトリガを2つ持つことはできません.ただし、BEFORE UPDATEトリガが1つ、BEFORE INSERTトリガが1つ、BEFORE UPDATEトリガが1つ、AFTER UPDATEトリガが1つあります.
trigger_stmtは、トリガがアクティブになったときに実行される文です.複数の文を実行する場合は、BEGIN...END複合文構造を使用します.これにより、ストレージ・サブルーチンで許可されている同じ文を使用できます.
三、解髪器の作成
1,ユーザテーブルuser
CREATE TABLE `user` (   
`id` int(11) NOT NULL auto_increment COMMENT'ユーザーID',`name`varchar(50)NOT NULL default'COMMENT'名',`sex`int(1)NOT NULL default'0'COMMENT'0は男性、1は女性、PRIMARY KEY  (`id`)   
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;   
  
INSERT INTO `user` (`id`, `name`, `sex`) VALUES   
(1,『天上星摘出』,0),(2, 'tank', 0);  
id
name
sex
1
天上の星を摘み取る
0
2
tank
0
2,コメントシートコメント
CREATE TABLE `comment` (   
`c_id` int(11) NOT NULL auto_increment COMMENT'コメントID',`u_id`int(11)NOT NULL COMMENT'ユーザーID',`name`varchar(50)NOT NULL default'COMMENT'ユーザー名',`content`varchar(1000)NOT NULL default''COMMENT'コメント内容',PRIMARY KEY  (`c_id`)   
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;   
  
INSERT INTO `comment` (`c_id`, `u_id`, `name`, `content`) VALUES   
(1,1,『天上星摘出』,『トリガテスト』),(2,1,『天上星摘出』,『フィールド冗長性の解決』),(3,2,'tank','コードを簡単にする');  
c_id
u_id
name
content
1
1
天上の星を摘み取る
トリガテスト
2
1
天上の星を摘み取る
フィールド冗長性の解決
3
2
tank
コードを簡単にする
ここに冗長フィールドnameがあります.コメントを読み取ると、userテーブルの名前を検索することができます.なぜ冗長フィールドがあるのでしょうか.簡単なsql文の実行効率が高いためですが、冗長フィールドが多ければ多いほど、冗長フィールドが多くなり、データベースの負担が増加します.
私がしなければならないことは、userテーブルのnameを更新すると、トリガが同時にcommentテーブルを更新し、phpコードを書いて更新しないことです.ユーザーが削除されると、commentテーブルでは、そのユーザーに関するデータが削除されます.
3,nameトリガの更新
delimiter|//mysqlデフォルトの終了記号はセミコロンであり、フリップフロップまたはストレージ・プロシージャを書くときにセミコロンが現れると、を実行するために中止されます.
drop trigger if exists updatename//同名のトリガを削除し、create trigger updatename after update on user for each row//トリガを確立し、begin   
//old,newはいずれも現在の操作を表す記録行であり、テーブル名としてもよい.   
if new.name!=old.name then//テーブルのユーザー名が変更された場合、を実行します.
update comment set comment.name=new.name where comment.u_id=old.id;   
end if;   
end||  
delimiter ;
3,トリガによるコメントデータの削除
delimiter ||   
drop trigger if exists deletecomment||   
create trigger deletecomment before delete on user for each row   
begin   
delete from comment where comment.u_id=old.id;   
end||   
delimiter ;  
少し憂鬱で、書いたトリガコードで、修正できません.削除して再構築しなければなりません.鬱陶しいです.ところで、phpmyadminもあります.トリガを作成することができます.できないものもあります.作成することができますが、見えません.検討しています.
4トリガが使用可能かどうかをテスト
a,updataトリガのテスト
update user set name='蒼鷹'where id=1;
更新してコメント表の中に行ってみて、中のnameフィールドの中の段は変わっていませんか
b,deleteトリガのテスト
delete from user  where id = 1;
更新してコメント表の中に行ってみて、中のnameフィールドの中の段は変わっていませんか
四、トリガの利点
1、トリガの「自動性」
プログラマーにとって、トリガは見えませんが、彼は確かに仕事をしています.トリガを使わなければ、userテーブルのnameフィールドを更新したとき、他のテーブルの冗長フィールドを更新するためにコードを書きます.私は例を挙げて、ただのテーブルです.何枚かのテーブルに冗長フィールドがあれば、あなたのコードはたくさん書きますか.不快に見えるのではないでしょうか.
2、トリガのデータ整合性
トリガにはロールバック性があります.例を挙げると、私は挙子が好きだと気づきました.5枚のテーブルのデータを更新すると、2枚のテーブルが更新されることはありませんが、他の3枚のテーブルは更新されていません.
しかしphpコードで書くと、2枚のテーブルのデータを更新したとき、データベースが切れてしまうなど、このような状況になる可能性があります.あなたは気がふさいで、ある更新して、ある更新していません.これでページが一致せずバグが発生しました.