此处的目标是根据条件更新一个表中的文本字段并将其连接起来。当使用用户表单中的某些文本更新文本列时,请运行更新后触发器。
触发器会运行,但会更新所有列,而不仅仅是已更改的列。请了解如何仅更新正确的行。
这是我迄今为止所拥有的 - 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 |
现在我知道它正在做我要告诉它的事情。我想只更新更新的行。感谢您的帮助。
答案 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在这里: