MySQL AFTER Update触发器使用New.col<> OLD.col

时间:2015-01-27 18:13:55

标签: mysql triggers phpmyadmin

此处的目标是根据条件更新一个表中的文本字段并将其连接起来。当使用用户表单中的某些文本更新文本列时,请运行更新后触发器。

触发器会运行,但会更新所有列,而不仅仅是已更改的列。请了解如何仅更新正确的行。

这是我迄今为止所拥有的 - SQLFiddle

| ID | SUBID | SWNOTES |
|----|-------|---------|     Table 1
|  1 |    40 |    test |
|  2 |    60 |         |



| ID | SUBID | CONTENT | SWFLAG |
|----|-------|---------|--------|
|  1 |    40 |   hello |      0 |     Table 2
|  2 |    60 | nothing |      0 |


CREATE TRIGGER `updatecontentnotes` AFTER UPDATE ON `tab1`
 FOR EACH ROW 
BEGIN

IF New.swnotes <> OLD.swnotes
THEN
    Update `tab2` 
Inner Join `tab1` ON `tab2`.`subid` = `tab1`.`subid` 
Set `tab2`.`swflag` = '1',`tab2`.`content` = CONCAT(`tab2`.`content`, `tab1`.`swnotes`)

Where `tab2`.`subid` = `tab1`.`subid` AND `tab2`.`swflag` = '0';

END IF;

END//

如果我用表:

更新表格
  Update `tab1`
set `swnotes` = "new"
where `subid` = '60'

我明白了:

| ID | SUBID |    CONTENT | SWFLAG |
|----|-------|------------|--------|
|  1 |    40 |  hellotest |      1 |
|  2 |    60 | nothingnew |      1 |

现在我知道它正在做我要告诉它的事情。我想只更新更新的行。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

由于触发器的内容将针对tab1上的每一行运行,因此您需要在WHERE子句中限制更多,以便它只会影响已更新的行。现在它更新了tab2

上的每一行

尝试将此添加到触发器SQL:

自:

Where `tab2`.`subid` = `tab1`.`subid` AND `tab2`.`swflag` = '0';

要:

Where `tab2`.`subid` = `tab1`.`subid` AND `tab2`.`swflag` = '0' AND `tab2`.`id` = OLD.id;

这会产生我认为您正在寻找的结果:

| ID | SUBID |    CONTENT | SWFLAG |
|----|-------|------------|--------|
|  1 |    40 |      hello |      0 |
|  2 |    60 | nothingnew |      1 |

更新的SQLFiddle在这里:

http://sqlfiddle.com/#!2/9fa2d2/1/0