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

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

Dec 19, 2016 pm 04:39 PM

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

phpmyadminを開く方法 phpmyadminを開く方法 Apr 10, 2025 pm 10:51 PM

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

MySQLの場所:データベースとプログラミング MySQLの場所:データベースとプログラミング Apr 13, 2025 am 12:18 AM

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

なぜMySQLを使用するのですか?利点と利点 なぜMySQLを使用するのですか?利点と利点 Apr 12, 2025 am 12:17 AM

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

Apacheのデータベースに接続する方法 Apacheのデータベースに接続する方法 Apr 13, 2025 pm 01:03 PM

Apacheはデータベースに接続するには、次の手順が必要です。データベースドライバーをインストールします。 web.xmlファイルを構成して、接続プールを作成します。 JDBCデータソースを作成し、接続設定を指定します。 JDBC APIを使用して、接続の取得、ステートメントの作成、バインディングパラメーター、クエリまたは更新の実行、結果の処理など、Javaコードのデータベースにアクセスします。

DockerによるMySQLを開始する方法 DockerによるMySQLを開始する方法 Apr 15, 2025 pm 12:09 PM

DockerでMySQLを起動するプロセスは、次の手順で構成されています。MySQLイメージをプルしてコンテナを作成および起動し、ルートユーザーパスワードを設定し、ポート検証接続をマップしてデータベースを作成し、ユーザーはすべての権限をデータベースに付与します。

MySQLの役割:Webアプリケーションのデータベース MySQLの役割:Webアプリケーションのデータベース Apr 17, 2025 am 12:23 AM

WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

Centosはmysqlをインストールします Centosはmysqlをインストールします Apr 14, 2025 pm 08:09 PM

CentOSにMySQLをインストールするには、次の手順が含まれます。適切なMySQL Yumソースの追加。 yumを実行して、mysql-serverコマンドをインストールして、mysqlサーバーをインストールします。ルートユーザーパスワードの設定など、MySQL_SECURE_INSTALLATIONコマンドを使用して、セキュリティ設定を作成します。必要に応じてMySQL構成ファイルをカスタマイズします。 MySQLパラメーターを調整し、パフォーマンスのためにデータベースを最適化します。

See all articles