我有两个查询 - 这两个查询都在phpMyAdmin中工作,但是当被触发器调用时,它不会工作(最底层的)
INSERT INTO stats_objects(idCatalogue,strAttrName,strAttrVal)
SELECT CatId,'strName',l.strName FROM Catalogue c
INNER JOIN item_live l ON c.idItem=l.id WHERE c.id=CatId; OK
INSERT INTO stats_objects(idCatalogue,strAttrName,strAttrVal)
SELECT CatId,'strOS',h.strOS FROM Catalogue c
INNER JOIN hosting_live h ON h.idItem=c.idItem WHERE c.id=CatId; BROKEN
表结构在hosting_live中有一对一的数据,h.idItem = l.id上有item_live,而item live与c.idItem = l.id目录中的每个唯一条目都是一对一的。< / p>
我是否再次盯着明显的流血,或者是否存在我错过的MySQL触发器和程序的微妙之处。这两个都在相同的过程中,由相同的触发器一个接一个地调用。没有临时表 - 没有我能看到的提交,没有动态SQL。触发器在目录上,但我看不到我正在更改目录。
任何人都有比我更好的眼睛和更新鲜的心情?
编辑:按要求触发代码
CREATE TRIGGER aiCatalogue AFTER INSERT ON catalogue FOR EACH ROW
BEGIN
/* do other stuff with unrelated tables */
CALL StatsObjectInsert(NEW.id);
END$$
在剥去所有叫做
的肉时非常基本CREATE PROCEDURE StatsObjectInsert(IN CatId int(10))
BEGIN
/* the procedure containing the above */
END$$
答案 0 :(得分:0)
第二个查询加入h.idItem=l.id
没有表格别名为L
。应该是c
答案 1 :(得分:0)
仅供记录。答案是上游对象的插入顺序。
我在两个表中插入一个分解为公共数据和属性的对象。从概念上讲,我插入一个项目,但实际上我正在执行两个插入。触发器与公共数据相关联,该数据触发了更新目录的序列。
目录触发了统计引擎的更新,告诉它有一个新项目并更新其内部模型。这反过来又试图调用对象特定的属性。
问题是因为触发器在两部分插入的第一部分上触发,属性数据尚未存在,因此统计引擎无法使用它并且失败 - 但是当我硬编码一个id来测试它工作正常,因为它是针对我已经存在的已经创建的对象。
那么课程?两部分插入的第一部分上的触发器将在第二部分开始之前触发 - 因此,如果数据不存在,则不要指望下游触发器能够找到数据。
其他课程:在决定重新规范表格之前先思考......