mysql trigger 觸發器

來源:互聯網
上載者:User

標籤:alter   let   begin   ext   欄位表   sql_mode   準備   trigger   error:   

建立觸發器:CREATE [DEFINER = {user|CURRENT_USER}]TRIGGER trigger_nametrigger_time trigger_eventON tbl_name FOR EACH ROWtrigger_body文法中:trigger_name:觸發器的名稱,不能與已經存在的觸發器重複;trigger_time:{ BEFORE | AFTER },表示在事件之前或之後觸發;trigger_event::{ INSERT |UPDATE | DELETE },觸發該觸發器的具體事件;tbl_name:該觸發器作用在tbl_name上;執行個體:建立簡單確發器<1> 準備學生表和學生數目統計表mysql> CREATE TABLE student_info (    -> stu_no INT(11) NOT NULL AUTO_INCREMENT,    -> stu_name VARCHAR(255) DEFAULT NULL,    -> PRIMARY KEY (stu_no)    -> );mysql> CREATE TABLE student_count(    -> student_count INT(11) DEFAULT 0    -> );插入一條資料:mysql> INSERT INTO student_count VALUES(0);<2> 建立簡單觸發器,在向學生表INSERT資料時,學生數增加,DELETE學生時,學生數減少http://blog.csdn.net/goskalrie/article/details/53020631mysql> CREATE TRIGGER trigger_student_count_insert     -> AFTER INSERT    -> ON student_count FOR EACH ROW    -> UPDATE student_count SET student_count=student_count+1;mysql> CREATE TRIGGER trigger_student_count_insert    -> AFTER INSERT    -> ON student_info FOR EACH ROW    -> UPDATE student_count SET student_count=student_count+1;mysql> CREATE TRIGGER trigger_student_count_delete    -> AFTER DELETE    -> ON student_info FOR EACH ROW    -> UPDATE student_count SET student_count=student_count-1;<3> INSERT、DELETE資料,查看觸發器是否正常工作mysql> INSERT INTO student_info VALUES(NULL,‘xiaoc‘),(NULL,‘xiaoz‘),(NULL,‘xionan‘);mysql> select * from student_info;+--------+----------+| stu_no | stu_name |+--------+----------+|      1 | xiaoc    ||      2 | xiaoz    ||      3 | xionan   |+--------+----------+3 rows in set (0.00 sec)mysql> desc student_info;+----------+--------------+------+-----+---------+----------------+| Field    | Type         | Null | Key | Default | Extra          |+----------+--------------+------+-----+---------+----------------+| stu_no   | int(11)      | NO   | PRI | NULL    | auto_increment || stu_name | varchar(255) | YES  |     | NULL    |                |+----------+--------------+------+-----+---------+----------------+2 rows in set (0.00 sec)刪除確發器,修改確發器:觸發器會隨著表的刪除被刪除!查看觸發器:show triggers;正解版:mysql> CREATE TABLE student_info (    ->     ->   stu_no INT(11) NOT NULL AUTO_INCREMENT,    ->     ->   stu_name VARCHAR(255) DEFAULT NULL,    ->     ->   PRIMARY KEY (stu_no)    ->     -> );Query OK, 0 rows affected (0.22 sec)mysql> CREATE TABLE student_count (    ->     ->   student_count INT(11) DEFAULT 0    ->     -> );Query OK, 0 rows affected (0.24 sec)mysql> INSERT INTO student_count VALUES(0);Query OK, 1 row affected (0.14 sec)mysql> CREATE TRIGGER trigger_student_count_insert    ->     -> AFTER INSERT    ->     -> ON student_info FOR EACH ROW    ->     -> UPDATE student_count SET student_count=student_count+1;Query OK, 0 rows affected (0.09 sec)mysql> CREATE TRIGGER trigger_student_count_delete    ->     -> AFTER DELETE    ->     -> ON student_info FOR EACH ROW    ->     -> UPDATE student_count SET student_count=student_count-1;Query OK, 0 rows affected (0.14 sec)mysql> INSERT INTO student_info VALUES(NULL,‘xiaoc‘),(NULL,‘xiaoz‘),(NULL,‘xionan‘);Query OK, 3 rows affected (0.05 sec)Records: 3  Duplicates: 0  Warnings: 0mysql> select * from student_info;+--------+----------+| stu_no | stu_name |+--------+----------+|      1 | xiaoc    ||      2 | xiaoz    ||      3 | xionan   |+--------+----------+3 rows in set (0.00 sec)mysql> select * from student_count;+---------------+| student_count |+---------------+|             3 |+---------------+1 row in set (0.00 sec)mysql> delete from student_info where stu_name in (‘xionan‘,‘xiaoc‘);Query OK, 2 rows affected (0.06 sec)mysql> select * from student_count;+---------------+| student_count |+---------------+|             1 |+---------------+1 row in set (0.00 sec)mysql> insert into student_info values(null,‘xiaol‘);Query OK, 1 row affected (0.06 sec)mysql> select * from student_info;+--------+----------+| stu_no | stu_name |+--------+----------+|      2 | xiaoz    ||      4 | xiaol    |+--------+----------+2 rows in set (0.00 sec)mysql> select * from student_count;+---------------+| student_count |+---------------+|             2 |+---------------+1 row in set (0.00 sec)可以看到無論是INSERT還是DELETE學生,學生數目都會跟變化的。建立包含多條執行語句的觸發器:在trigger_body中可以執行多條SQL語句,此時的trigger_body需要使用BEGIN和END做為開始和結束的標誌:CREATE    [DEFINER = { user | CURRENT_USER }]    TRIGGER trigger_name    trigger_time trigger_eventON tbl_name FOR EACH ROWBEGINtrigger_statementEND;樣本2,建立包含多條執行語句的觸發器:(刪除觸發器)mysql> show triggers\G;*************************** 1. row ***************************             Trigger: trigger_student_count_insert               Event: INSERT               Table: student_info           Statement: UPDATE student_count SET student_count=student_count+1              Timing: AFTER             Created: NULL            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION             Definer: [email protected]character_set_client: utf8collation_connection: utf8_general_ci  Database Collation: latin1_swedish_ci*************************** 2. row ***************************             Trigger: trigger_student_count_delete               Event: DELETE               Table: student_info           Statement: UPDATE student_count SET student_count=student_count-1              Timing: AFTER             Created: NULL            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION             Definer: [email protected]character_set_client: utf8collation_connection: utf8_general_ci  Database Collation: latin1_swedish_ci2 rows in set (0.00 sec)ERROR: No query specifiedmysql> DROP TRIGGER trigger_student_count_insert;Query OK, 0 rows affected (0.10 sec)mysql> DROP TRIGGER trigger_student_count_delete;Query OK, 0 rows affected (0.00 sec)mysql> show triggers;Empty set (0.00 sec)依然沿用上面的例子中的表,對student_count表做如下變更:增加student_class欄位表示具體年級的學生數,其中0表示全年級,1代表1年級……;同樣學生表中也增加該欄位。清空兩個表中的所有資料。1:對student_count表增加student_class欄位:mysql> show create table student_count;+---------------+-------------------------------------------------------------------------------------------------------------+| Table         | Create Table                                                                                                |+---------------+-------------------------------------------------------------------------------------------------------------+| student_count | CREATE TABLE `student_count` (  `student_count` int(11) DEFAULT ‘0‘) ENGINE=InnoDB DEFAULT CHARSET=latin1 |+---------------+-------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)mysql> alter table student_count add student_class int(11) default ‘0‘;Query OK, 0 rows affected (0.33 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> show create table student_count;+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+| Table         | Create Table                                                                                                                                       |+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+| student_count | CREATE TABLE `student_count` (  `student_count` int(11) DEFAULT ‘0‘,  `student_class` int(11) DEFAULT ‘0‘) ENGINE=InnoDB DEFAULT CHARSET=latin1 |+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)<1> 刪除上例中的兩個觸發器,初始化student_count表中資料,插入三條資料(0,0),(1,0),(2,0)表示全年級、一年級、二年級的初始人數都是0;mysql> update student_count set student_count=0;Query OK, 1 row affected (0.07 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from student_count;+---------------+---------------+| student_count | student_class |+---------------+---------------+|             0 |             0 |+---------------+---------------+1 row in set (0.00 sec)mysql> insert student_count values(1,0),(2,0);Query OK, 2 rows affected (0.07 sec)Records: 2  Duplicates: 0  Warnings: 0mysql> select * from student_count;+---------------+---------------+| student_count | student_class |+---------------+---------------+|             0 |             0 ||             1 |             0 ||             2 |             0 |+---------------+---------------+3 rows in set (0.00 sec)<2> 建立觸發器,在INSERT時首先增加學生總人數,然後判斷新增的學生是幾年級的,再增加對應年級的學生總數:mysql> select * from student_info;+--------+----------+| stu_no | stu_name |+--------+----------+|      2 | xiaoz    ||      4 | xiaol    |+--------+----------+2 rows in set (0.00 sec)mysql> delete from student_info where stu_name=‘xiaoz‘;Query OK, 1 row affected (0.03 sec)mysql> delete from student_info where stu_name=‘xiaol‘;Query OK, 1 row affected (0.06 sec)mysql> select * from student_info;Empty set (0.00 sec)上面是先清理一下資料:欄位的增加有誤,順序有誤:mysql> alter table student_count drop student_count;Query OK, 0 rows affected (0.36 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> desc student_count;+---------------+---------+------+-----+---------+-------+| Field         | Type    | Null | Key | Default | Extra |+---------------+---------+------+-----+---------+-------+| student_class | int(11) | YES  |     | 0       |       |+---------------+---------+------+-----+---------+-------+1 row in set (0.00 sec)mysql> alter table student_count add student_count int(11) default ‘0‘;Query OK, 0 rows affected (0.41 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> show create table student_count;+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+| Table         | Create Table                                                                                                                                       |+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+| student_count | CREATE TABLE `student_count` (  `student_class` int(11) DEFAULT ‘0‘,  `student_count` int(11) DEFAULT ‘0‘) ENGINE=InnoDB DEFAULT CHARSET=latin1 |+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)mysql> delete from student_count where student_class=0;Query OK, 3 rows affected (0.06 sec)重新插入資料:mysql> insert student_count values(0,0),(1,0),(2,0);Query OK, 3 rows affected (0.08 sec)Records: 3  Duplicates: 0  Warnings: 0mysql> select * from student_count;+---------------+---------------+| student_class | student_count |+---------------+---------------+|             0 |             0 ||             1 |             0 ||             2 |             0 |+---------------+---------------+3 rows in set (0.00 sec)http://blog.csdn.net/goskalrie/article/details/53020631對student_count表做如下變更:增加student_class欄位表示具體年級的學生數,其中0表示全年級,1代表1年級……;同樣學生表中也增加該欄位。清空兩個表中的所有資料。mysql> alter table student_info add column student_class int//Query OK, 0 rows affected (1.31 sec)Records: 0  Duplicates: 0  Warnings: 0mysql> desc student_info//+---------------+--------------+------+-----+---------+----------------+| Field         | Type         | Null | Key | Default | Extra          |+---------------+--------------+------+-----+---------+----------------+| stu_no        | int(11)      | NO   | PRI | NULL    | auto_increment || stu_name      | varchar(255) | YES  |     | NULL    |                || student_class | int(11)      | YES  |     | NULL    |                |+---------------+--------------+------+-----+---------+----------------+3 rows in set (0.00 sec)建立觸發器,在INSERT時首先增加學生總人數,然後判斷增加學生總人數,然後判斷新增的學生幾年級的,再增加對應年級的學生總數。mysql> delimiter $$mysql> create trigger trigger_student_count_insert    -> after insert    -> on student_info for each row    -> begin    -> update student_count set student_count=student_count+1 where student_class=0;    -> update student_count set student_count=student_count+1 where student_class=new.student_class;    -> end    -> $$Query OK, 0 rows affected (0.09 sec)mysql> delimiter;建立觸發器,在DELETE時首先減少學生總人數,然後判斷刪除的學生是幾年級的,再減少對應年級的學生總數;mysql> DELIMITER $$mysql> mysql> CREATE TRIGGER trigger_student_count_delete    ->     -> AFTER DELETE    ->     -> ON student_info FOR EACH ROW    ->     -> BEGIN    ->     -> UPDATE student_count SET student_count=student_count-1 WHERE student_class=0;    ->     -> UPDATE student_count SET student_count=student_count-1 WHERE student_class= OLD.student_class;    ->     -> END    ->     -> $$Query OK, 0 rows affected (0.15 sec)mysql> mysql> DELIMITER ;mysql> desc student_info//+---------------+--------------+------+-----+---------+----------------+| Field         | Type         | Null | Key | Default | Extra          |+---------------+--------------+------+-----+---------+----------------+| stu_no        | int(11)      | NO   | PRI | NULL    | auto_increment || stu_name      | varchar(255) | YES  |     | NULL    |                || student_class | int(11)      | YES  |     | NULL    |                |+---------------+--------------+------+-----+---------+----------------+3 rows in set (0.00 sec)向學生表中分別插入多條不同年級的學生資訊,查看觸發器是否起做用:mysql>  INSERT INTO student_info VALUES(NULL,‘AAA‘,1),(NULL,‘BBB‘,1),(NULL,‘CCC‘,2),(NULL,‘DDD‘,2),(NULL,‘ABB‘,1),(NULL,‘ACC‘,1);Query OK, 6 rows affected (0.12 sec)Records: 6  Duplicates: 0  Warnings: 0mysql> select * from student_info;+--------+----------+---------------+| stu_no | stu_name | student_class |+--------+----------+---------------+|      1 | AAA      |             1 ||      2 | BBB      |             1 ||      3 | CCC      |             2 ||      4 | DDD      |             2 ||      5 | ABB      |             1 ||      6 | ACC      |             1 |+--------+----------+---------------+6 rows in set (0.00 sec)mysql> select * from student_count;+---------------+---------------+| student_class | student_count |+---------------+---------------+|             1 |             4 ||             2 |             2 ||             0 |             6 |+---------------+---------------+3 rows in set (0.00 sec)可以看到,總共插入6條資料,學生總數是6,1年級4個,2年級2個,trigger正確執行。從學生表中分別岀除多條不同年級的學生資訊,查看觸發器是否起作用:mysql> delete from student_info where stu_name like ‘A%‘;Query OK, 3 rows affected (0.15 sec)mysql> SELECT * FROM student_info;+--------+----------+---------------+| stu_no | stu_name | student_class |+--------+----------+---------------+|      2 | BBB      |             1 ||      3 | CCC      |             2 ||      4 | DDD      |             2 |+--------+----------+---------------+3 rows in set (0.00 sec)mysql> select * from student_count;+---------------+---------------+| student_class | student_count |+---------------+---------------+|             1 |             1 ||             2 |             2 ||             0 |             3 |+---------------+---------------+3 rows in set (0.00 sec)從學生表中將姓名以A開頭的學生資訊刪除,學生資訊刪除的同時,數量表也跟隨變化。在上面的樣本中,使用了三個新的關鍵字:DELIMITER、NEW、OLD,這三個關鍵字在官網上“觸發器文法”一節中都有介紹

 

mysql trigger 觸發器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.