MySQL AFTER 更新触发器 New.col<> OLD.col

MySQL AFTER Update trigger with New.col<> OLD.col

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

触发器 运行s 但更新所有列,而不仅仅是具有 changed.Trying 的列,以了解如何只更新正确的行。

这是我目前所拥有的- 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//

如果我用 say:

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

我得到:

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

现在我知道它正在按照我的指示去做。我只想更新更新的行。感谢您对此的任何帮助。

由于触发器的内容将为 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