我在为 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 看到第一个“;”作为 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 ;
触发器可以在使用
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;