目次
我的MYSQL学习心得(十二)
ホームページ データベース mysql チュートリアル 我的MYSQL学习心得(十二)_MySQL

我的MYSQL学习心得(十二)_MySQL

Jun 01, 2016 pm 01:08 PM

我的MYSQL学习心得(十二)

我的MYSQL学习心得(一)

我的MYSQL学习心得(二)

我的MYSQL学习心得(三)

我的MYSQL学习心得(四)

我的MYSQL学习心得(五)

我的MYSQL学习心得(六)

我的MYSQL学习心得(七)

我的MYSQL学习心得(八)

我的MYSQL学习心得(九)

我的MYSQL学习心得(十)

我的MYSQL学习心得(十一)

 

这一篇《我的MYSQL学习心得(二)》将会讲解MYSQL的触发器

 

触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL

也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。


创建触发器

语法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event    ON tbl_name FOR EACH ROW trigger_stmt
ログイン後にコピー

触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与临时表表或视图关联起来。

trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

·         INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。

·         UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。

·         DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。

请注意,trigger_event与以表操作方式激活触发程序的SQL语句并不很类似,这点很重要。

例如,关于INSERT的BEFORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。

 

可能会造成混淆的例子之一是INSERT INTO .. ON DUPLICATE UPDATE ...语法:BEFORE INSERT触发程序对于每一行将激活,后跟AFTER INSERT触发程序,或BEFORE UPDATE和AFTER UPDATE触发程序,具体情况取决于行上是否有重复键。

对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。

例如,对于某一表,不能有两个BEFORE UPDATE触发程序。

但可以有1个BEFORE UPDATE触发程序和1个BEFORE INSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTER UPDATE触发程序。

 

trigger_stmt是当触发程序激活时执行的语句。

如果你打算执行多个语句,可使用BEGIN ... END复合语句结构。这样,就能使用存储子程序中允许的相同语句。

 

创建一个单执行语句的触发器

CREATE TABLE account(acct_num INT ,amount DECIMAL(10,2));CREATE TRIGGER ins_sum BEFORE INSERT ON accountFOR EACH ROW SET @SUM=@SUM+new.amount;
ログイン後にコピー

首先创建一个account表,表中有两个字段,分别为:acct_num字段(定义为int类型)

amount字段(定义成浮点类型);其次创建一个名为ins_sum的触发器,触发的条件是向数据表account插入数据之前,

对新插入的amount字段值进行求和计算

DECLARE @num INTSET @num=0INSERT INTO account VALUES(1,1.00),(2,2.00)SELECT @num
ログイン後にコピー

首先创建一个account表,在向表account插入数据之前,计算所有新插入的account表的amount值之和,

触发器的名称为ins_num,条件是在向表插入数据之前触发。

 

 

创建有多个执行语句的触发器,语法如下:

DELIMITER | CREATE TRIGGER testref BEFORE INSERT ON test1  FOR EACH ROW BEGIN    INSERT INTO test2 SET a2 = NEW.a1;    DELETE FROM test3 WHERE a3 = NEW.a1;      UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;  END|
ログイン後にコピー

查看触发器

查看触发器是指数据库中已存在的触发器的定义、状态、语法信息等。

可以使用SHOW TRIGGERS 和在TRIGGERS 表中查看触发器信息

SHOW TRIGGERS 
ログイン後にコピー

 

Trigger  Event   Table    Statement                 Timing  Created  sql_mode  Definer         character_set_client  collation_connection  Database Collation-------  ------  -------  ------------------------  ------  -------  --------  --------------  --------------------  --------------------  ------------------ins_sum  INSERT  account  set @sum=@sum+new.amount  BEFORE  (NULL)             root@localhost  utf8                  utf8_general_ci       utf8_general_ci   
ログイン後にコピー

EVENT表示激活触发器的事件,这里的触发事件为插入操作INSERT,TABLE表示激活触发器的对象表,这里为account 表

Timing表示触发器的时间,为插入之前(BEFORE);Statement 表示触发器执行的操作,还有一些其他信息,比如SQL模式,触发器的定义帐户和字符集等

 

在TRIGGERS 表中查看触发器信息

information_schema数据库的TRIGGERS 表中,可以通过查询查看触发器信息

SELECT * FROM `information_schema`.`TRIGGERS` WHERE `TRIGGER_NAME`='ins_sum'
ログイン後にコピー
TRIGGER_CATALOG  TRIGGER_SCHEMA  TRIGGER_NAME  EVENT_MANIPULATION  EVENT_OBJECT_CATALOG  EVENT_OBJECT_SCHEMA  EVENT_OBJECT_TABLE  ACTION_ORDER  ACTION_CONDITION  ACTION_STATEMENT          ACTION_ORIENTATION  ACTION_TIMING  ACTION_REFERENCE_OLD_TABLE  ACTION_REFERENCE_NEW_TABLE  ACTION_REFERENCE_OLD_ROW  ACTION_REFERENCE_NEW_ROW  CREATED  SQL_MODE  DEFINER         CHARACTER_SET_CLIENT  COLLATION_CONNECTION  DATABASE_COLLATION---------------  --------------  ------------  ------------------  --------------------  -------------------  ------------------  ------------  ----------------  ------------------------  ------------------  -------------  --------------------------  --------------------------  ------------------------  ------------------------  -------  --------  --------------  --------------------  --------------------  ------------------def              school          ins_sum       INSERT              def                   school               account                        0  (NULL)            set @sum=@sum+new.amount  ROW                 BEFORE         (NULL)                      (NULL)                      OLD                       NEW                       (NULL)             root@localhost  utf8                  utf8_general_ci       utf8_general_ci   
ログイン後にコピー

TRIGGER_SCHEMA 表示触发器所在的数据库

TRIGGER_NAME表示触发器的名称

EVENT_OBJECT_TABLE表示在哪个表上触发

ACTION_STATEMENT 表示触发器触发的时候执行的具体操作

ACTION_ORIENTATION是ROW,表示在每条记录上都触发

ACTION_TIMING表示触发的时刻是BEFORE


删除触发器

使用DROP TRIGGER 语句可以删除MYSQL中已经定义的触发器,删除触发器的基本语法

DROP TRIGGER [schema_name.]trigger_name
ログイン後にコピー

其中(schema_name)是可选的

如果省略了schema(方案),将从当前方案中舍弃触发程序。

删除ins_sum触发器

DROP TRIGGER `school`.`ins_sum`
ログイン後にコピー

触发器ins_sum删除成功


总结

对于相同的表,相同的事件只能创建一个触发器,比如对表account创建了BEFORE INSERT触发器

那么如果对表account再次创建一个BEFORE INSERT触发器,MYSQL就会报错,此时,只可以在表account上

创建AFTER INSERT或者BEFORE UPDATE类型的触发器

 

 

如有不对的地方,欢迎大家拍砖o(∩_∩)o  

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

DockerでのMySQLメモリの使用を減らします DockerでのMySQLメモリの使用を減らします Mar 04, 2025 pm 03:52 PM

この記事では、DockerのMySQLメモリ使用量を最適化することを調査します。 監視手法(Docker統計、パフォーマンススキーマ、外部ツール)および構成戦略について説明します。 これらには、Dockerメモリの制限、スワッピング、およびcgroupsが含まれます

mysqlの問題を解決する方法共有ライブラリを開くことができません mysqlの問題を解決する方法共有ライブラリを開くことができません Mar 04, 2025 pm 04:01 PM

この記事では、MySQLの「共有ライブラリを開くことができない」エラーについて説明します。 この問題は、必要な共有ライブラリ(.so/.dllファイル)を見つけることができないMySQLの障害に起因しています。ソリューションには、システムのパッケージMを介してライブラリのインストールを確認することが含まれます。

Alter Tableステートメントを使用してMySQLのテーブルをどのように変更しますか? Alter Tableステートメントを使用してMySQLのテーブルをどのように変更しますか? Mar 19, 2025 pm 03:51 PM

この記事では、MySQLのAlter Tableステートメントを使用して、列の追加/ドロップ、テーブル/列の名前の変更、列データ型の変更など、テーブルを変更することについて説明します。

Linuxでmysqlを実行します(phpmyAdminを使用してポッドマンコンテナを使用して/なし) Linuxでmysqlを実行します(phpmyAdminを使用してポッドマンコンテナを使用して/なし) Mar 04, 2025 pm 03:54 PM

この記事では、PHPMyAdminの有無にかかわらず、LinuxにMySQLを直接インストールするのとPodmanコンテナを使用します。 それは、各方法のインストール手順を詳述し、孤立、携帯性、再現性におけるポッドマンの利点を強調しますが、

sqliteとは何ですか?包括的な概要 sqliteとは何ですか?包括的な概要 Mar 04, 2025 pm 03:55 PM

この記事では、自己完結型のサーバーレスリレーショナルデータベースであるSQLiteの包括的な概要を説明します。 SQLiteの利点(シンプルさ、移植性、使いやすさ)と短所(同時性の制限、スケーラビリティの課題)を詳しく説明しています。 c

MACOSで複数のMySQLバージョンを実行する:ステップバイステップガイド MACOSで複数のMySQLバージョンを実行する:ステップバイステップガイド Mar 04, 2025 pm 03:49 PM

このガイドは、HomeBrewを使用してMacOSに複数のMySQLバージョンをインストールおよび管理することを示しています。 Homebrewを使用して設置を分離し、紛争を防ぐことを強調しています。 この記事では、インストール、開始/停止サービス、および最高のPRAを詳述しています

MySQL接続用のSSL/TLS暗号化を構成するにはどうすればよいですか? MySQL接続用のSSL/TLS暗号化を構成するにはどうすればよいですか? Mar 18, 2025 pm 12:01 PM

記事では、証明書の生成と検証を含むMySQL用のSSL/TLS暗号化の構成について説明します。主な問題は、セルフ署名証明書のセキュリティへの影響を使用することです。[文字カウント:159]

人気のあるMySQL GUIツール(MySQL Workbench、PhpMyAdminなど)は何ですか? 人気のあるMySQL GUIツール(MySQL Workbench、PhpMyAdminなど)は何ですか? Mar 21, 2025 pm 06:28 PM

記事では、MySQLワークベンチやPHPMyAdminなどの人気のあるMySQL GUIツールについて説明し、初心者と上級ユーザーの機能と適合性を比較します。[159文字]

See all articles