【MySQL 12】トリガー

Feb 04, 2017 pm 01:40 PM

トリガーは特殊なタイプのストアド プロシージャであり、前に紹介したストアド プロシージャとは異なります。トリガーは主にイベントによってトリガーされ、自動的に呼び出されて実行されます。ストアド プロシージャは、ストアド プロシージャの名前で呼び出すことができます。
トリガーの主な機能は、参照整合性よりも複雑な 2 つ以上のテーブル間でデータの整合性と整合性を実現することです。これにより、テーブル内のデータの変更がデータベース設計者のルールによって決定されたビジネスに確実に準拠するようになります。
トリガーは、テーブルの挿入、更新、削除時に自動的に実行される特殊なストアド プロシージャです。トリガーは通常、より複雑なチェック制約を持つ制約で使用されます。
トリガーと通常のストアド プロシージャの違いは、トリガーが特定のテーブルに対して動作することです。更新、挿入、削除などの操作中に、システムはテーブル上の対応するトリガーを自動的に呼び出して実行します。
SQL Server 2005 のトリガーは、DML トリガーと DDL トリガーの 2 つのカテゴリに分類できます。DDL トリガーは、さまざまなデータ定義言語ステートメントに影響を与え、これらのステートメントには、create、alter、drop ステートメントがトリガーされます。

DML トリガーは次のように分類されます:

1. トリガー後 (後にトリガー)
a. トリガーの挿入
c. トリガーの代わりに (トリガー前に)
3 差分 f.トリガーは、特定の操作 (挿入、更新、削除) を実行した後にのみトリガーされる必要があり、テーブルでのみ定義できます。
定義された操作 (挿入、更新、削除) は実行されず、トリガー自体のみが実行されることを意味します。トリガーの代わりに、テーブルまたはビューにトリガーを定義できます。

挿入テーブルと削除テーブル

トリガーを使用する場合、SQL Server はトリガーごとに 2 つの特別な一時テーブル、つまり挿入テーブルと削除テーブルを作成します。これら 2 つのテーブルはメモリに保存され、トリガーが作成されたテーブルと同じ構造を持ち、システムによって維持および管理され、ユーザーは変更できません。各トリガーは、独自の一時テーブルにのみアクセスできます。トリガーの実行後、2 つのテーブルは自動的に解放されます。

(1) 挿入されたテーブルは、INSERT または UPDATE ステートメントの影響を受ける行のコピーを保存するために使用されます。挿入または更新操作が実行されると、トリガーをアクティブ化する新しいデータ行がベース テーブルと挿入テーブルの両方に追加されます。

(2) 削除されたテーブルは、削除または更新ステートメントの影響を受ける行のコピーを保存するために使用されます。削除または更新操作が実行されると、指定された元のデータ行が実表から削除され、削除された表に転送されます。一般に、実表と削除された表には同じデータ行は存在しません。

更新操作は 2 つのステップに分かれています。基本テーブルのデータ行を削除されたテーブルにコピーし、変更された新しいデータ行を挿入されたテーブルから基本テーブルにコピーします。つまり、更新操作の場合、削除されたテーブルには変更前の古い値が格納され、挿入されたテーブルには変更後の新しい値が格納されます。

トリガー作成構文の 4 つの要素:

1.监视地点(table) 
2.监视事件(insert/update/delete) 
3.触发时间(after/before) 
4.触发事件(insert/update/delete)
ログイン後にコピー

構文:

delimiter &&create trigger trigger
Nameafter/before insert/update/delete on 表名
for each row   #这句话在mysql是固定的
beginsql语句;
end&&
ログイン後にコピー

商品テーブル

mysql> create table g(
    -> id int auto_increment primary key,    -> name varchar(10),    -> num int    -> );
ログイン後にコピー

注文テーブル

mysql> create table o(
    -> idd int auto_increment primary key,    -> gid int,    -> much int    -> );
ログイン後にコピー

商品の挿入:

mysql> insert into g (name,num) value ('juzi',20);mysql> select * from g;
+----+------+------+| id | name | num  |
+----+------+------+|  3 | juzi |   20 |
+----+------+------+
ログイン後にコピー

トリガーを使用しなかった場合: 今、3 つの商品を販売したとします。 2 つのことを行う必要があります

1. 注文テーブルにレコードを挿入します

insert into o(gid,much) values(1,3);
ログイン後にコピー

2. 製品テーブルの品目 1 の残り数量を更新します

update g set num=num-3 where id=1;
ログイン後にコピー

トリガーを作成します:

delimiter &
mysql> create trigger trg1
    -> after insert on o    -> for each row    -> begin    -> update g set num = num -3 where id = 1;    -> end&
ログイン後にコピー

実行:

insert into o(gid,much) values(1,3)$
ログイン後にコピー
ログイン後にコピー

結果:

製品 1 の数量が 7 に変更されたことがわかります。これは、注文を挿入すると、トリガーが自動的に更新操作を実行することを意味します。

しかしここで問題が発生しました。トリガーの num と id がハードコーディングされているため、どの製品を購入しても、最終的には製品 1 の数量が更新されます。たとえば、別のレコードを注文テーブルに挿入します。 insert into o(gid,much) names(2,3) を実行すると、製品 1 の数量は 4 に変更されましたが、製品 2 の数量は変更されたことがわかります。これは明らかに私たちが望む結果ではありません。前に作成したトリガーを変更する必要があります。

トリガー内の行の値をどのように参照しますか。つまり、新しく挿入した注文レコード内の gid または much の値を取得する必要があります。

挿入の場合、新しく挿入された行は new で表され、行内の各列の値は new.column 名で表されます。

これでトリガーを次のように変更できるようになりました

create trigger tg2 
after insert on o 
for each row 
begin 
update g set num=num-new.much where id=new.gid;(注意此处和第一个触发器的不同) 
end$
ログイン後にコピー

2 番目のトリガーが作成されました。まず最初のトリガーを削除しましょう

drop トリガー tg1$

もう一度テストして注文レコードを挿入しましょう :insert into o(gid, much)values(2,3)$

実行後、製品 2 の数量が 7 に変更されていることがわかります。これは現在では正しいことです。

まだ 2 つの状況があります:

1.当用户撤销一个订单的时候,我们这边直接删除一个订单,我们是不是需要把对应的商品数量再加回去呢?

2.当用户修改一个订单的数量时,我们触发器修改怎么写?

我们先分析一下第一种情况:

监视地点:o表

监视事件:delete

触发时间:after

触发事件:update

对于delete而言:原本有一行,后来被删除,想引用被删除的这一行,用old来表示,old.列名可以引用被删除的行的值。

那我们的触发器就该这样写:

create trigger tg3
after delete on o
for each row
begin
update g set num = num + old.much where id = old.gid;(注意这边的变化)
end$
ログイン後にコピー

创建完毕。

再执行

delete from o where oid = 2$
ログイン後にコピー

会发现商品2的数量又变为10了。

第二种情况:

监视地点:o表

监视事件:update

触发时间:after

触发事件:update

对于update而言:被修改的行,修改前的数据,用old来表示,old.列名引用被修改之前行中的值;

修改的后的数据,用new来表示,new.列名引用被修改之后行中的值。

那我们的触发器就该这样写:

create trigger tg4
after update on o
for each row
begin
update g set num = num+old.much-new.much where id = old/new.gid;
end$
ログイン後にコピー

先把旧的数量恢复再减去新的数量就是修改后的数量了。

我们来测试下:先把商品表和订单表的数据都清掉,易于测试。

假设我们往商品表插入三个商品,数量都是10,

买3个商品1:

insert into o(gid,much) values(1,3)$
ログイン後にコピー
ログイン後にコピー

这时候商品1的数量变为7;

我们再修改插入的订单记录:

update o set much = 5 where oid = 1$
ログイン後にコピー

我们变为买5个商品1,这时候再查询商品表就会发现商品1的数量只剩5了,说明我们的触发器发挥作用了。

以上就是 【MySQL 12】触发器的内容,更多相关内容请关注PHP中文网(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イメージをプルしてコンテナを作成および起動し、ルートユーザーパスワードを設定し、ポート検証接続をマップしてデータベースを作成し、ユーザーはすべての権限をデータベースに付与します。

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

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

MySQLをCentos7にインストールする方法 MySQLをCentos7にインストールする方法 Apr 14, 2025 pm 08:30 PM

MySQLをエレガントにインストールするための鍵は、公式のMySQLリポジトリを追加することです。特定の手順は次のとおりです。MYSQLの公式GPGキーをダウンロードして、フィッシング攻撃を防ぎます。 mysqlリポジトリファイルを追加:rpm -uvh https://dev.mysql.com/get/mysql80-community-rease-el7-3.noarch.rpm update yumリポジトリキャッシュ:yumアップデートインストールmysql:yumインストールmysql-server startup mysql sportin

See all articles