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

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

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

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

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

CREATE TRIGGER
{ BEFORE | AFTER } { INSERT | DELETE }
ON ROW


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

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

CREATE TRIGGER { BEFORE | AFTER }

{ DELETE | ON
各行


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

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


CREATE TRIGGER
{ BEFORE | AFTER }
{ DELETE }
ON

FOR EACH ROW
に特定のテーブル: このテーブルに対して挿入、更新、または削除操作が実行されると、トリガーがアクティブになります。 同じテーブル内の同じイベントに対して 2 つのトリガーを配置することはできません。


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

CREATE TRIGGER

{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON ;
FOR EACH ROW

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

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

CREATE TRIGGER

{ BEFORE | AFTER }
{ DELETE }
ON


FOR EACH ROWトリガーには、トリガーされる 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)'A' THEN SET NEW.s1=0; END IF;//

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 までご連絡ください。
MySQLはSQLiteとどのように違いますか?MySQLはSQLiteとどのように違いますか?Apr 24, 2025 am 12:12 AM

MySQLとSQLiteの主な違いは、設計コンセプトと使用法のシナリオです。1。MySQLは、大規模なアプリケーションとエンタープライズレベルのソリューションに適しており、高性能と高い並行性をサポートしています。 2。SQLiteは、モバイルアプリケーションとデスクトップソフトウェアに適しており、軽量で埋め込みやすいです。

MySQLのインデックスとは何ですか?また、パフォーマンスをどのように改善しますか?MySQLのインデックスとは何ですか?また、パフォーマンスをどのように改善しますか?Apr 24, 2025 am 12:09 AM

MySQLのインデックスは、データの取得をスピードアップするために使用されるデータベーステーブル内の1つ以上の列の順序付けられた構造です。 1)インデックスは、スキャンされたデータの量を減らすことにより、クエリ速度を改善します。 2)B-Tree Indexは、バランスの取れたツリー構造を使用します。これは、範囲クエリとソートに適しています。 3)CreateIndexステートメントを使用して、createIndexidx_customer_idonorders(customer_id)などのインデックスを作成します。 4)Composite Indexesは、createIndexIDX_CUSTOMER_ORDERONORDERS(Customer_Id、Order_date)などのマルチコラムクエリを最適化できます。 5)説明を使用してクエリ計画を分析し、回避します

データの一貫性を確保するために、MySQLでトランザクションを使用する方法を説明します。データの一貫性を確保するために、MySQLでトランザクションを使用する方法を説明します。Apr 24, 2025 am 12:09 AM

MySQLでトランザクションを使用すると、データの一貫性が保証されます。 1)StartTransactionを介してトランザクションを開始し、SQL操作を実行して、コミットまたはロールバックで送信します。 2)SavePointを使用してSave Pointを設定して、部分的なロールバックを許可します。 3)パフォーマンスの最適化の提案には、トランザクション時間の短縮、大規模なクエリの回避、分離レベルの使用が合理的に含まれます。

どのシナリオでMySQLよりもPostgreSQLを選択できますか?どのシナリオでMySQLよりもPostgreSQLを選択できますか?Apr 24, 2025 am 12:07 AM

MySQLの代わりにPostgreSQLが選択されるシナリオには、1)複雑なクエリと高度なSQL関数、2)厳格なデータの整合性と酸コンプライアンス、3)高度な空間関数が必要、4)大規模なデータセットを処理するときに高いパフォーマンスが必要です。 PostgreSQLは、これらの側面でうまく機能し、複雑なデータ処理と高いデータの整合性を必要とするプロジェクトに適しています。

MySQLデータベースをどのように保護できますか?MySQLデータベースをどのように保護できますか?Apr 24, 2025 am 12:04 AM

MySQLデータベースのセキュリティは、以下の測定を通じて達成できます。1。ユーザー許可管理:CreateUSERおよびGrantコマンドを通じてアクセス権を厳密に制御します。 2。暗号化された送信:SSL/TLSを構成して、データ送信セキュリティを確保します。 3.データベースのバックアップとリカバリ:MySQLDUMPまたはMySQLPumpを使用して、定期的にデータをバックアップします。 4.高度なセキュリティポリシー:ファイアウォールを使用してアクセスを制限し、監査ロギング操作を有効にします。 5。パフォーマンスの最適化とベストプラクティス:インデックス作成とクエリの最適化と定期的なメンテナンスを通じて、安全性とパフォーマンスの両方を考慮に入れます。

MySQLのパフォーマンスを監視するために使用できるツールは何ですか?MySQLのパフォーマンスを監視するために使用できるツールは何ですか?Apr 23, 2025 am 12:21 AM

MySQLのパフォーマンスを効果的に監視する方法は? MySqladmin、ShowGlobalStatus、PerconAmonitoring and Management(PMM)、MySQL EnterpriseMonitorなどのツールを使用します。 1. mysqladminを使用して、接続の数を表示します。 2。showglobalstatusを使用して、クエリ番号を表示します。 3.PMMは、詳細なパフォーマンスデータとグラフィカルインターフェイスを提供します。 4.mysqlenterprisemonitorは、豊富な監視機能とアラームメカニズムを提供します。

MySQLはSQL Serverとどのように違いますか?MySQLはSQL Serverとどのように違いますか?Apr 23, 2025 am 12:20 AM

MySQLとSQLServerの違いは次のとおりです。1)MySQLはオープンソースであり、Webおよび埋め込みシステムに適しています。2)SQLServerはMicrosoftの商用製品であり、エンタープライズレベルのアプリケーションに適しています。ストレージエンジン、パフォーマンスの最適化、アプリケーションシナリオの2つには大きな違いがあります。選択するときは、プロジェクトのサイズと将来のスケーラビリティを考慮する必要があります。

どのシナリオでMySQLよりもSQL Serverを選択できますか?どのシナリオでMySQLよりもSQL Serverを選択できますか?Apr 23, 2025 am 12:20 AM

高可用性、高度なセキュリティ、優れた統合を必要とするエンタープライズレベルのアプリケーションシナリオでは、MySQLの代わりにSQLServerを選択する必要があります。 1)SQLServerは、高可用性や高度なセキュリティなどのエンタープライズレベルの機能を提供します。 2)VisualStudioやPowerbiなどのMicrosoftエコシステムと密接に統合されています。 3)SQLSERVERは、パフォーマンスの最適化に優れた機能を果たし、メモリが最適化されたテーブルと列ストレージインデックスをサポートします。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 Mac版

SublimeText3 Mac版

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