触发器可以在表格被改变之前或之后自动运行多个SQL语句,包括
INSERT
、
UPDATE
或
DELETE
操作。*
文档详细解释了触发器的用法。
例如,你可以按照下面的示例创建一个
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
,在
test
表的行更新后,将
1
添加到
log
表的
upd
字段中。如下所示。*您可以将
AFTER
和
UPDATE
替换为
BEFORE
和
INSERT
或
DELETE
,以在将行插入到
test
表之前或删除
test
表的行之前运行
count
触发器。在触发器中,允许使用
SELECT INTO
,但不允许使用没有
INTO
的
SELECT
,因为存在
错误。基本上,当创建触发器时,您需要将默认分隔符
;
更改为类似
$$
的内容,否则会出错。然后,在创建触发器之后,您需要将分隔符
$$
更改回
;
,如下所示。
我的答案解释了分隔符的使用方法,并且在创建存储过程时,您必须选择一个数据库,否则会出现
错误。
DELIMITER $$
CREATE TRIGGER count
AFTER UPDATE ON test FOR EACH ROW
BEGIN
UPDATE log SET upd = upd + 1;
END$$
DELIMITER ;
然后,您在“test”表中将“num”从“2”更新为“4”,然后如下所示,“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 |
+
此外,您可以通过
OLD.num
和
NEW.num
获取更新前后的
num
值。*这些
num
值分别存储在
用户定义的会话变量@old_num
和
@new_num
中,您不能将
OLD.num
和
NEW.num
用于
INSERT
和
DELETE
,因为分别存在
错误和
错误。
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 ;
然后,在更新了test表中的num字段从2到4之后,@old_num和@new_num分别为2和4,如下所示:
然后,在更新了test表中的num字段从2到4之后,@old_num和@new_num分别为2和4,如下所示:
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;