快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门威斯尼斯人娱乐平台:MySQL 5.0触发器(参考)(1)触发器



Conventions and Styles约定和编程风格

每次我想要演示实际代码时,我会对mysql客户真个屏幕就呈现的代码进行调剂,将字体改成Courier,使他们看起来与通俗文本不一样(让大年夜家差别法度榜样代码和正文)。在这里举个例子:

mysql> DROP FUNCTION f;

Query OK, 0 rows affected (0.00 sec)

假如实例对照大年夜,则必要在某些行和段落间加注释,同时我会用将"mysql> CREATE PROCEDURE p ()

-> BEGIN

-> /* This procedure does nothing */END;//

Query OK, 0 rows affected (0.00 sec)

无意偶尔候我会将例子中的"mysql>"和"->"这些系统显示去掉落,你可以直接将代码复制到mysql客户端法度榜样中(假如你现在所读的不是电子版的,可以在mysql.com网站下载相关脚本)

以是的例子都已经在Suse 9.2 Linux、Mysql 5.0.3公共版上测试经由过程。在您涉猎本书的时刻,Mysql已经有更高的版本,同时能支持更多OS了,包括Windows,Sparc,HP-UX。是以这里的例子将能正常的运行在您的电脑上。但假如运行仍旧呈现故障,可以咨询你熟识的资深Mysql用户,这样就能获得对照好的支持和赞助。

Why Triggers 为什么要用触发器

我们在MySQL 5.0中包孕对触发器的支持是因为以下缘故原由:

MySQL早期版本的用户经久有必要触发器的要求。

我们曾经许诺支持所有ANSI标准的特点。

您可以应用它来反省或预防坏的数据进入数据库。

您可以改变或者取消INSERT, UPDATE以及DELETE语句。

您可以在一个会话中监视数据改变的动作。

在这里我假定大年夜家都读过"MySQL新特点"丛书的第一集--"MySQL存储历程",那么大年夜家都应该知道MySQL至此存储历程和函数,那是很紧张的常识,由于在触发器中你可以应用在函数中应用的语澳门威斯尼斯人娱乐平台句。分外举个例子:

复合语句(BEGIN / END)是合法的.

流节制(Flow-of-control)语句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.

变量声明(DECLARE)以及指派(SET)是合法的.

容许前提声明.

非常处置惩罚声明也是容许的.

然则在这里要记着函数有受限前提:不能在函数中造访表.是以在函数中应用以下语句是不法的。

ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE

DROP 'FLUSH PRIVILEGES' GRANT INSERT KILL

LOCK OPTIMIZE REPAIR REPLACE REVOKE

ROLLBACK SAVEPOINT 'SELECT FROM table'

'SET system variable' 'SET TRANSACTION'

SHOW 'START TRANSACTION' TRUNCATE UPDATE

在触发器中也有完全一样的限定.

触发器相对而言对照新,是以会有(bugs)缺陷.以是我在这里给大年夜家警告,就像我在存储历程书中所说那样.不要在含有紧张数据的数据库中应用这个触发器,假如必要的话在一些以测试为目的的数据库上应用,同时在你对表创建触发器时确认这些数据库是默认的。

Syntax 语法

1. Syntax: Name 语法:命名规则

CREATE TRIGGER

FOR EACH ROW

触发器必须着名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他工具的命名要领基真相象.

6. Syntax: Statement 语法:语句

CREATE TRIGGER

{ BEFORE | AFTER }

{ INSERT | UPDATE | DELETE }

ON

FOR EACH ROW

触发器包孕所要触发的SQL语句:这里的语句可所以任何合法的语句,包括复合语句,然则这里的语句受的限定和函数的一样。

Privileges权限

你必须拥有相昔时夜的权限才能创建触发器(CREATE TRIGGER)。假如你已经是Root用户,那么就足够了。这跟SQL的标准有所不合,我也盼望能尽快改成标准的。

是以鄙人一个版本的MySQL中,你完全有可能看到有一种叫做CREATE TRIGGER的新权限。然后经由过程这样的措施付与:

GRANT CREATE TRIGGER ONTO ;

也可以经由过程这样收回权限:

REVOKE CREATE TRIGGER ONFROM ;

Referring to OLD and NEW columns 关于旧的和新创建的列的标识

在触发器的SQL语句中,你可以关联表中的随意率性列。但你不能仅应用列的名称去标识,那会使系统肴杂,由于那里可能会有列的新名(这可能恰是你要改动的,你的动作可能恰是要改动列名),还有列的旧名存在。是以你必须用这样的语法来标识:

"NEW . column_name"或者"OLD . column_name".这样在技巧上处置惩罚(NEW | OLD . column_name)新和旧的列名属于创建了过渡变量("transition variables")。

对付INSERT语句,只有NEW是合法的;对付DELETE语句,只有OLD才合法;而UPDATE语句可以在和NEW以及OLD同时应用。下面是一个UPDATE中同时应用NEW和OLD的例子。

Example of a "check" constraint

"check"完备性约束例子

What's a "check" constraint 什么是"澳门威斯尼斯人娱乐平台check"约束

在标准的SQL说话中,我们可以在(CREATE TABLE)创建表的历程中应用"CHECK (澳门威斯尼斯人娱乐平台condition)",

例如:

CREATE TABLE t25

(s1 INT, s2 CHAR(5), PRIMARY KEY (s1),

CHECK (LEFT(s2,1)='A'))

ENGINE=INNODB;

这里CHECK的意思是"当s2列的最左边的字符不是'A'时,insert和update语句都邑不法",MySQL的视图不支持CHECK,我小我是很盼望它能支持的。但假如你很必要在表中应用这样的功能,我建议大年夜家应用触发器来实现。

CREATE TABLE t25

(s1 INT, s2 CHAR(5),

PRIMARY KEY (s1))

ENGINE=INNODB//

CREATE TRIGGER t25_bi

BEFORE INSERT ON t25

FOR EACH ROW

IF LEFT(NEW.s2,1)'A' THEN SET NEW.s1=0; END IF;//

我只必要应用BEFORE INSERT和BEFORE UPDATE语句就行了,删除了触发器不会对表有影响,同时AFTER的触发器也不能改动NEW的历程变量(transition variables)。为了激活触发器,我履行了向表中的行插入s1=0的数据,之后只要履行相符LEFT(s2,1) <> 'A'前提的动作都邑掉败:

INSERT INTO t25 VALUES (0,'a') /* priming the pump */ //

INSE澳门威斯尼斯人娱乐平台RT INTO t25 VALUES (5,'b') /* g澳门威斯尼斯人娱乐平台ets error '23000' */ //

您可能还会对下面的文章感兴趣: