MySQL CREATE TRIGGER语法

2013-03-12_090935

这是MySQL 5实力养成暨评量里的8-46.‘建立触发程序使用者需要下列何项权限?’

[adsense][/adsense]

答案:(D)Super

朋友们可以参考简体中文手册MySQL 5.1参考手册 :: 21.触发程序::21.1. CREATE TRIGGER语法,ㄚ琪引用于下并转译成繁体中文:

CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
触发程序是与资料​​表有关的命名资料库物件,当资料表上出现特定事件时,将激活该物件。

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

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复合语句结构。这样,就能使用预储子程序中允许的相同语句。请参见20.2.7节,“BEGIN … END复合语句”。

在MySQL 5.1中,可以编写包含按名称对资料表进行直接引用的触发程序,如下例中所示的名为testref的触发程序:

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)
使用别名OLD和NEW,能够引用与触发程序相关的资料表中的列。OLD. col_name在更新或删除它之前,引用已有行中的1列。NEW. col_name在更新它之后引用将要插入的新行的1列或已有行的1列。

激活触发程序时,对于触发程序引用的所有OLD和NEW列,需要具有SELECT权限,对于作为SET赋值目标的所有NEW列,需要具有UPDATE权限。

注释:目前,触发程序不会被阶层式的外部键动作激活。该限制将会被尽早放宽。

CREATE TRIGGER语句需要SUPER权限。

另外较新的英文手册可参阅MySQL 5.6 Reference Manual :: 13 SQL Statement Syntax :: 13.1 Data Definition Statements :: 13.1.15 CREATE TRIGGER Syntax

另外在8-45.‘下列对于引用相同资料表,相同事件的触发程序的叙述何者正确?’

2013-05-06_151016

 

答案:(C)可同时有一个BEFORE触发程序,一个AFTER触发程序

One comment

Comments are closed.