ホームページ  >  記事  >  データベース  >  MySQL 5.0 の新機能チュートリアルのトリガー: レクチャー 1

MySQL 5.0 の新機能チュートリアルのトリガー: レクチャー 1

黄舟
黄舟オリジナル
2016-12-19 16:39:55958ブラウズ

Conventions and StylesConventions and Programming Styles

実際のコードをデモするたびに、mysql クライアント画面に表示されるコードを調整し、フォントを Courier に変更して、通常のテキストと異なって見えるようにします (プログラムをみんなに区別してもらいましょう)コードとテキスト)。以下に例を示します:


mysql> DROP FUNCTION f;
Query OK, 0 rows according to (0.00 sec)

インスタンスが比較的大きい場合は、特定の行と段落の間にコメントを追加する必要があります。 「<--」記号は強調のためにページの右側に配置されています。例:


mysql> CREATE PROCEDURE p ()
-> BEGIN
-> /* このプロシージャは何も行いません */ <--
-> 影響を受ける行は 0 です0.00 秒)

場合によっては、サンプル内の「mysql>」および「->」システム表示を削除します。コードを mysql クライアント プログラムに直接コピーできます (現在読んでいる内容が電子バージョンではない場合)。関連するスクリプトは mysql.com Web サイトからダウンロードできます)

すべての例は、Suse 9.2 linux および Mysql 5.0.3 パブリック バージョンでテストされています。この本を読んでいる時点では、Mysql はすでに上位バージョンになっており、Windows、Sparc、HP-UX など、より多くの OS をサポートできるようになりました。したがって、ここでの例はコンピューター上で正常に実行されます。ただし、それでも操作が失敗する場合は、知り合いの経験豊富な Mysql ユーザーに相談すると、より良いサポートと支援が得られます。

トリガーの理由 トリガーを使用する理由

以下の理由により、MySQL 5.0 にトリガーのサポートが組み込まれました:

MySQL の以前のバージョンのユーザーは、長い間トリガーを必要としてきました。

私たちはすべてのANSI標準機能をサポートすることを約束しました。
これを使用して、不正なデータがデータベースに入るのをチェックしたり防ぐことができます。
INSERT、UPDATE、DELETE ステートメントを変更またはキャンセルできます。
セッション内のデータの変更を監視できます。

ここでは、誰もが「MySQL 新機能」シリーズの最初のエピソードである「MySQL ストアド プロシージャ」を読んでいることを前提としています。その後、誰もが MySQL ストアド プロシージャと関数について知っているはずです。これは、コンバータでトリガーする場合に必要となるためです。関数で使用するのと同じステートメントを使用できます。特別な例:

複合ステートメント (BEGIN / END) は正当です。

制御フロー ステートメント (IF、CASE、WHILE、LOOP、WHILE、REPEAT、LEAVE、ITERATE) も正当です。

変数宣言 (DECLARE) ) と代入 (SET) は正当です。

条件付き宣言が許可されます。

例外処理宣言も許可されます。

ただし、ここで関数には制限があることを覚えておいてください: 関数内に含めることはできません。したがって、テーブルにアクセスすることは違法です。関数内の次のステートメント。

ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE

DROP 'FLUSH PRIVILEGES' GRANT INSERT KILL

LOCK OPTIMIZE REPAIR REPLACE REVOKE

ROLLBACK SAVEPOINT 'SELECT FROM table'

'SET システム変数' 'SET TRアンアクション」

SHOW 'START TRANSACTION' TRUNCATE UPDATE

トリガーにもまったく同じ制限があります

トリガーは比較的新しいため、前述したように、ここで警告しています。必要に応じて、テーブルにトリガーを作成するときに、これらのデータベースがデフォルトであることを確認してください。

構文

1. 構文: 名前の構文: 命名規則

CREATE TRIGGER <トリガー名<--
{ BEFORE | AFTER }
{ INSERT | DELETE }
ON <テーブル名>
FOR EACH ROW
<トリガー SQL ステートメント>

トリガーには最大 64 文字の名前が必要で、その後に区切り文字を付けることができます。これは、基本的に MySQL の他のオブジェクトの命名方法と同様です

I。ここでの習慣は、テーブル名 + '_' + トリガー タイプの省略形を使用することです。したがって、テーブル t26 の場合、トリガーはイベント UPDATE の前にあります (以下の (2) と (3) を参照)。 ) (BEFORE) の場合、その名前は t26_bu です。

2. 構文: 時間 構文: トリガー時間

CREATE TRIGGER <トリガー名>
{ BEFORE | AFTER } <--
{ INSERT | DELETE }
ON <テーブル名> ROW
<トリガーされた SQL ステートメント>

トリガーには実行時間の設定があり、イベントの発生前または後に設定できます。

3. 構文: イベント構文: Event

CREATE TRIGGER <トリガー名>{ BEFORE | AFTER }

{ DELETE | <--
ON <テーブル名>
各行
<トリガーされた SQL ステートメント>

トリガーされるイベントを設定することもできます。挿入、更新、または削除の実行中にトリガーできます。

4. 構文:テーブル 構文:テーブル


CREATE TRIGGER <トリガー名>
{ BEFORE | AFTER }
{ DELETE }
ON

<
FOR EACH ROW
<トリガーされた SQL ステートメント>に特定のテーブル: このテーブルに対して挿入、更新、または削除操作が実行されると、トリガーがアクティブになります。

同じテーブル内の同じイベントに対して 2 つのトリガーを配置することはできません。


5. 構文: 粒度 構文: ( : (ステップサイズ) トリガー間隔

CREATE TRIGGER

{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON ;
FOR EACH ROW <--
<トリガーされた SQL ステートメント>

トリガーの実行間隔: FOR EACH ROW 句は、テーブル全体に対して 1 回ではなく、1 行おきにアクションを実行するようにトリガーに通知します

6. 構文: ステートメントの構文: ステートメント

CREATE TRIGGER <トリガー名>

{ BEFORE | AFTER }
{ DELETE }
ON


FOR EACH ROW<トリガーされた SQL ステートメント<
トリガーには、トリガーされる SQL ステートメントが含まれます。ここでのステ​​ートメントは、複合ステートメントを含む任意の正当なステートメントにすることができますが、ここでのステ​​ートメントには、関数

権限

と同じ制限が適用されます。作成するには、かなりの権限が必要です。トリガー (CREATE TRIGGER)。すでに Root ユーザーであれば、これで十分です。SQL 標準とは異なりますので、できるだけ早く標準に変更できることを願っています。 MySQL では、CREATE TRIGGER という新しい権限が表示される可能性が高く、次の方法でそれを付与します:

GRANT CREATE TRIGGER ON
TO ;

権限を取り消すこともできます。次のように:

REVOKE CREATE TRIGGER ON

FROM ;

OLD 列と NEW 列の参照古い列と新しい列の識別

トリガーの SQL ステートメント内、テーブル内の任意の列を関連付けることができますが、列の名前だけを使用して列を識別することはできません。列の新しい名前が存在する可能性があるため、システムが混乱します (これは変更したいものである可能性があります)。アクションは列名を変更することである可能性があります)、列の古い名前が存在するため、それを識別するには次の構文を使用する必要があります: "NEW . column_name" または "OLD . column_name" これは技術的には (NEW | OLD . column_name) 遷移変数 (「遷移変数」) として新しい列名と古い列名が作成されます。


INSERT ステートメントの場合は NEW のみが有効であり、DELETE ステートメントの場合は OLD のみが有効であり、UPDATE ステートメントは NEW と OLD を同時に使用できます。以下は UPDATE で NEW と OLD を同時に使用する例です。

t22 の更新前にトリガー t21_au を作成します

各行ごとに

BEGIN

SET @old = OLD .

SET @new = NEW.s1;

END;//

今、t21 の s1 列の場合table 値が 55 の場合、「UPDATE t21 SET s1 = s1 + 1」を実行すると、@old の値は 55、@new の値は 56 になります。

トリガーを使用してテーブルを作成するためのトリガーを使用した CREATE と INSERT CREATE と INSERT CREATE テーブルの例

ここでのすべてのルーチンでは、区切り文字が // (DELIMITER //) に設定されていると仮定します。


CREATE TABLE t22 (s1 INTEGER)//

CREATE TRIGGER t22_bi

t22の挿入前

各行

BEGIN

SET @x = 'トリガーがアクティブになりました!';

SET NEW.s1 = 55;

END ;//

最初に、t22 という名前のテーブルを作成し、テーブル t22 にトリガー t22_bi を作成しました。テーブルに行を挿入する場合、トリガーがアクティブになり、実行がアクションを変更します。列 s1 ~ 55 の値。

トリガーを使用したテーブルのINSERTは、トリガーを使用して挿入アクションを実行します



mysql> INSERT INTO t22 VALUES (1)//

データの行がテーブルt2に挿入され、トリガーに対応するテーブル?

ここで挿入されたアクションは非常に一般的なものであり、それを実行するためにトリガー権限は必要ありません。トリガーが関連付けられているかどうかを知る必要さえありません。

mysql> SELECT @x, t22.* FROM t22//

+----------------------+------+

| @x |

+---------------------+-----+
| トリガーが作動しました!

+------------------------+------+

セット内の 1 行 (0.00 秒)

INSERT が表示されます。アクション後の結果は予想通りで、×マークが変更されています。ここに挿入されたデータは最初に入力した挿入データではなく、トリガー自身のデータです。

「チェック」制約の例
「チェック」整合性制約の例

「チェック」制約とは「チェック」制約とは

標準SQL言語では、(CREATE TABLE)でテーブルを作成できます。 CHECK (条件)」のプロセスで、
例:


CREATE TABLE t25
(s1 INT, s2 CHAR(5), PRIMARY KEY (s1),
CHECK (LEFT(s2,1)='A'))
ENGINE=INNODB;

ここでの CHECK は、「 s2 列の左端の文字が 'A' ではない場合、挿入および更新ステートメントは不正になります。」MySQL のビューは CHECK をサポートしていません。個人的には、それがサポートされることを願っています。ただし、テーブル内でそのような関数を本当に使用する必要がある場合は、トリガーを使用してそれを実現することをお勧めします。


CREATE TABLE t25
(s1 INT, s2 CHAR(5),
Primary KEY (s1))
ENGINE=INNODB//

t25に挿入する前にTABLE t25_bi
を作成
各行
左の場合(NEW. s2,1)<>A' THEN SET NEW.s1=0; END IF;//

t25 の更新前にトリガー t25_bu を作成
各行
IF LEFT(NEW.s2,1)

BEFORE INSERT ステートメントと BEFORE UPDATE ステートメントを使用するだけで済み、トリガーの削除はテーブルに影響しません。新しいプロセス変数 (遷移変数) は変更できません。トリガーをアクティブにするために、テーブル内の行に s1=0 のデータを挿入しました。その後、LEFT(s2,1) <> 条件を満たすアクションは失敗します。 INTO t25 VALUES (0,'a') /* ポンプを呼び水します */ //

INSERT INTO t25 VALUES (5,'b') /* エラー '23000' が発生します */ //

古いことを信じないでくださいMySQL マニュアル
古い MySQL マニュアルを捨てる時が来ました

私はここで、過去の MySQL マニュアルの内容を信じないように警告します。トリガーに関する誤った記述は削除しましたが、オンラインには古いバージョンのマニュアルが多数残っています。たとえば、これはドイツ語の URL です:


http://dev.mysql.com/doc /mysql/de/ANSI_diff_Triggers。 .html.

このマニュアルでは、トリガーはストアド プロシージャであると説明していますが、トリガーはトリガーであり、ストアド プロシージャは依然としてストアド プロシージャです。


マニュアルには、トリガーを他のテーブルから削除したり、トランザクションを削除したときに起動したりできるとも書かれています。彼が何を意味するにせよ、それは忘れてください。MySQL はこれを実装しません。

最後に、トリガーの使用がクエリの速度に影響を与えるというのは間違いです。トリガーはクエリに影響を与えません。

バグ

ueは翻訳されません)

2004年12月14日、http://bugs.mysql.comで「trigger」または

「tri」の「詳細検索」を実行しました。 ggers'、アクティブな 17 人がいることがわかりましたもちろん、この記事を読む前に消える可能性があります

、まだ消えていない場合に備えて、重要なバグがまだ残っている場合は、回避する必要があります。トリガーを試しているとき。


Bug#5859 DROP TABLE はトリガーを削除しません。
テーブルを削除するとき、テーブルのトリガーの削除は自動的に行われる必要があります。「DROP TRIGGER < ;table name> . ".
正しい方法は、"DROP TRIGGER "です。


Bug#5894 変更されたテーブルを含むトリガーは、データベースを破損させます。
データベースデータが破壊されます)
次のようなテーブルは変更しないでください。 has a trigger on it, until you know this is fix.


結論最後に

この本の最後には、見直したり再読したりする必要はないと思います。私が上で述べたことは誰でも簡単に思い出せると思います。

上記は、MySQL 5.0 新機能チュートリアル トリガー: レクチャー 1 の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。




声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。