2016-08-03 1 views
-1

次のようなMySQLトリガがわかりますか?デリミタとトリガの照会

DELIMITER ?? 
CREATE TRIGGER before_results_update 
BEFORE UPDATE ON Student_Results 
FOR EACH ROW BEGIN 
INSERT INTO Result_Changes 
SET ACTION = 'update', 
ResultID = OLD.ID, 
Result = OLD.Result, 
User = USER(), 
ChangedOn = NOW(); 
END ?? 
DELIMITER ; 

答えて

1

DELIMITERはブロック全体の境界を作成します。開始時と終了時にラッパー全体の場合は、??を文字列として使用します。最後に、;がDELIMITERとして設定されていますが、これはすべての文の終わりの入力に使用されています。 DELIMITERSはSQLFiddleやPHPMyAdminでは使用されませんが、MySQL Workbenchなどにあります。だからクライアント側のことです。あなたが使っているものによって異なります。

テーブルStudent_Resultsへの実際のUPDATE前に、テーブルResult_Changesに5つの列名を指定してINSERT(挿入文字stmtのあまり使用されないスタイルを使用)を実行します。

Student_Resultsにはまだ技術的にUPDATEは発生していません。しかし、トリガはそこで更新される予定の行にアクセスし、OLDと呼ばれる特別な「行名」で参照されます。

FOR EACH ROWは1からN回ループできます。

+0

@Drewの明確な説明をありがとうございます。声明の中には予防できる障害がありますか?ありがとうございます – gymcode

+0

私は考えることができません。 SQLFiddleを使用してスキーマやデータの読み込みに問題が発生したり、スタブを外してしまった場合は、後でそれを心得てください。 – Drew