"在"插入后触发器

时间:2016-09-22 15:22:17

标签: mysql triggers

我必须在表格中插入一个新行,其中一个文本列包含对另一个表格ID的引用。例如: INSERT INTO table1(参考,日期)VALUES(' 23,24,25',' 2016-09-22');

我的触发器应该更新table2.status,其中table2.id是table1.reference值之一。现在它是这样的:

DELIMITER ;;
CREATE TRIGGER `rim_ai` AFTER INSERT ON `table1` FOR EACH ROW
UPDATE table2 SET status = 11 WHERE id IN (NEW.reference);;
DELIMITER ;

但是......我发现状态值仅在第一行改变(例如,ID为23的那一行)。 如果我的触发器中的某些东西被破坏,它应该根本不更新! 我应该将参考字段转换为其他内容而不是' text&#39 ;? 提前致谢。

1 个答案:

答案 0 :(得分:0)

这不是你的触发器被打破,而是你的桌子设计。您实际上不应该在由逗号(或任何其他分隔符)分隔的单个字段中存储一系列值。您应该将每个参考日期对存储在自己的记录中。

而不是

reference | date
23,24,25  |2016-09-22

reference | date
23        |2016-09-22
24        |2016-09-22
25        |2016-09-22

在这种情况下,您的触发器将按预期工作。虽然,我会略微重写where条款:

...WHERE id = NEW.reference

从技术上讲,您可以使用多表更新语句和find_in_set()函数使触发器与当前数据结构一起使用,但我不建议这样做。

您遇到的行为的原因是id IN (NEW.reference)表达式未评估为id IN (23,24,25)in运算符中的3个值集合),而是{{1 (包含3个数字的单个字符串)。 MySQL默默地将id IN ('23,24,25')字符串转换为数字,这将导致数字23(23之后的逗号不能被解释为数字的一部分,因此MySQL在转换时停止,返回23作为数字)。因此,仅更新id = 23的记录。