數據庫基礎觸發器

1、概念

       觸發器(Trigger)是用戶定義在關係表上的一類由事件驅動的特殊過程,一旦定義,任何用戶

對錶的增、刪、改操作均由服務器自動激活相應的觸發器,在DBMS核心層進行集中的完整性控制。


2、定義觸發器

      create trigger <觸發器名>  before|after <觸發事件> on <表名>

  for each row|statement  [when <觸發條件>] <觸發動作體>

 

     觸發事件:可以是 insert、delete 或 update ,可以是幾個事件的組合,用or連接

                         update 後面還可以有 of<觸發列,...> 

     觸發器類型:分爲 for each row(行級觸發器)和 for each statement(語句級觸發器,觸發一次)

     觸發動作體:可以是一個過程塊或是對已創建存儲過程的調用,如果是行級觸發器,可以在過程體中

使用 new 和 old 引用 update/insert 事件之後的新值和 update/delete 事件之前的舊值


3、激活觸發器

       同一個表上的多個觸發器激活時的執行順序:

        1)執行該表上的 before 觸發器 

        2)激活觸發器的 SQL 語句

        3)執行該表上的 after 觸發器

       查看觸發器是否被激活:show triggers

 

4、刪除觸發器

      drop trigger <觸發器名> on  <表名>


5、mysql 觸發器實例

CREATE TABLE test1(a1 INT);

CREATE TABLE test2(a2 INT);

CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);

CREATE TABLE test4(

  a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 

  b4 INT DEFAULT 0

);

 

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

|

 

DELIMITER ;

 

INSERT INTO test3 (a3) VALUES 

  (NULL), (NULL), (NULL), (NULL), (NULL), 

  (NULL), (NULL), (NULL), (NULL), (NULL);

 

INSERT INTO test4 (a4) VALUES 

  (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);


如果將下述值插入表test1,如下所示:

mysql> INSERT INTO test1 VALUES 

    -> (1), (3), (1), (7), (1), (8), (4), (4);


Query OK, 8 rows affected (0.01 sec)

Records: 8  Duplicates: 0  Warnings: 0


那麼4個表中的數據如下:


mysql> SELECT * FROM test1;

+------+

| a1   |

+------+

|    1 |

|    3 |

|    1 |

|    7 |

|    1 |

|    8 |

|    4 |

|    4 |

+------+

8 rows in set (0.00 sec)

 

mysql> SELECT * FROM test2;

+------+

| a2   |

+------+

|    1 |

|    3 |

|    1 |

|    7 |

|    1 |

|    8 |

|    4 |

|    4 |

+------+

8 rows in set (0.00 sec)

 

mysql> SELECT * FROM test3;

+----+

| a3 |

+----+

|  2 |

|  5 |

|  6 |

|  9 |

| 10 |

+----+

5 rows in set (0.00 sec)

 

mysql> SELECT * FROM test4;

+----+------+

| a4 | b4   |

+----+------+

|  1 |    3 |

|  2 |    0 |

|  3 |    1 |

|  4 |    2 |

|  5 |    0 |

|  6 |    0 |

|  7 |    1 |

|  8 |    1 |

|  9 |    0 |

| 10 |    0 |

+----+------+

10 rows in set (0.00 sec)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章