为MySQL数据库中的表创建触发器(语法错误)

问题描述 投票:0回答:2

我在为 MySQL 数据库定义触发器时遇到问题。我想在插入新行之前更改文本字段(在给定条件下)。这是我尝试过的:

CREATE TRIGGER add_bcc
BEFORE INSERT ON MailQueue
FOR EACH ROW BEGIN
  IF (NEW.sHeaders LIKE "%[email protected]%") THEN
    SET NEW.sHeaders = NEW.sHeaders + "BCC:[email protected]";
  END IF;
END; 

但我总是收到错误“语法错误”。我被困住了,我做错了什么? 我正在使用 MySQL 5.0.51a-community

顺便说一句:创建一个像这样的空触发器效果很好:

CREATE TRIGGER add_bcc
BEFORE INSERT ON MailQueue
FOR EACH ROW BEGIN
END; 

但这也失败了:

CREATE TRIGGER add_bcc
BEFORE INSERT ON MailQueue 
FOR EACH ROW BEGIN
  IF 1=1 THEN
  END IF; 
END;

这是我第一次使用 stackoverflow.com,所以如果在这里发布一些内容对我有帮助,我会非常兴奋:-)

mysql sql triggers
2个回答
29
投票

您需要更改分隔符 - MySQL 看到第一个“;”作为 CREATE TRIGGER 语句的结尾。

试试这个:

/* Change the delimiter so we can use ";" within the CREATE TRIGGER */
DELIMITER $$

CREATE TRIGGER add_bcc
BEFORE INSERT ON MailQueue
FOR EACH ROW BEGIN
  IF (NEW.sHeaders LIKE "%[email protected]%") THEN
    SET NEW.sHeaders = NEW.sHeaders + "BCC:[email protected]";
  END IF;
END$$
/* This is now "END$$" not "END;" */

/* Reset the delimiter back to ";" */
DELIMITER ;

0
投票

触发器可以在使用

INSERT
UPDATE
DELETE
更改表之前或之后自动运行多个 SQL 语句。 *文档详细解释了触发器。

例如,您创建

test
表,如下所示:

CREATE TABLE test (
  num int
);

然后,插入

num
2
的行,如下所示:

INSERT INTO test (num) VALUES (2);

接下来,您创建

log
表,如下所示:

CREATE TABLE log (
  ins INT,
  upd INT,
  del INT
);

然后,插入

ins
upd
del
0
的行,如下所示:

INSERT INTO test_log (ins, upd, del) VALUES (0, 0, 0);

现在,您可以创建

count
触发器,在更新
1
表的行后,将
upd
添加到
log
表中的
test
,如下所示。 *您可以分别将
AFTER
UPDATE
替换为
BEFORE
INSERT
DELETE
,以便在向
count
表插入行或删除
test
表的行之前运行
test
触发器基本上,创建触发器时需要将默认分隔符
;
更改为
$$
,否则会出错,然后创建触发器后,需要将分隔符
$$
更改回
;
,如下所示和我的回答解释了分隔符,并且在创建过程时必须选择数据库,否则会出现错误

DELIMITER $$

CREATE TRIGGER count
AFTER UPDATE ON test FOR EACH ROW
BEGIN
UPDATE log SET upd = upd + 1;
END$$

DELIMITER ;

然后,您将

num
表中的
2
4
更新为
test
,则
upd
1
,如下所示:

mysql> UPDATE test SET num = 4;
...
mysql> SELECT num FROM test;
+------+
| num  |
+------+
|    4 |
+------+
...
mysql> SELECT * FROM log;       
+------+------+------+
| ins  | upd  | del  |
+------+------+------+
|    0 |    1 |    0 |
+------+------+------+

此外,您还可以分别通过

num
OLD.num
获取更新前后的
NEW.num
值。 *
num
值分别存储在用户定义的会话变量
@old_num
@new_num
中:

DELIMITER $$

CREATE TRIGGER count
AFTER UPDATE ON test FOR EACH ROW
BEGIN
UPDATE log SET upd = upd + 1;
SET @old_num = OLD.num, @new_num = NEW.num;
END$$

DELIMITER ;

那么,将

@old_num
表中的
@new_num
2
更新为
4
后,
num
2
分别为
4
test
,如下所示:

mysql> UPDATE test SET num = 4;
...
mysql> SELECT num FROM test;
+------+
| num  |
+------+
|    4 |
+------+
...
mysql> SELECT * FROM log;       
+------+------+------+
| ins  | upd  | del  |
+------+------+------+
|    0 |    1 |    0 |
+------+------+------+
...
mysql> SELECT @old_num, @new_num;
+----------+----------+
| @old_num | @new_num |
+----------+----------+
|        2 |        4 |
+----------+----------+

并且,在下面的情况下,您可以创建

count
触发器,而不将分隔符更改为
$$
,不会出现错误:

CREATE TRIGGER count
AFTER UPDATE ON test FOR EACH ROW
UPDATE log SET upd = upd + 1;
© www.soinside.com 2019 - 2024. All rights reserved.