2016-09-22 65 views
0

我必须在表中插入一个新行,其中包含对另一个表的ID的引用的文本列。例如: INSERT INTO table1(reference,date)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)。 如果在我的触发器中发生什么事情,它应该什么都不更新! 我应该将参考字段转换为“文本”以外的内容吗? 在此先感谢。

回答

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个值的),但如(含有单串的3个数字)id IN ('23,24,25')。 MySQL将'23,24,25'字符串静默转换为数字,这将导致数字23(23之后的逗号不能被解释为数字的一部分,因此MySQL以转换返回23作为数字停止)。因此只更新id = 23的记录。

+0

你显然是对的......我懒洋洋地试图解决引用表的创建问题。谢谢。 –