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 在这里:
此处的目标是根据条件将文本字段从一个 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 在这里: