我必须在表格中插入一个新行,其中一个文本列包含对另一个表格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 ;? 提前致谢。
答案 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的记录。