MySQL相同(几乎)查询 - 当触发器调用时,它们不会工作

时间:2013-07-31 09:37:17

标签: mysql stored-procedures triggers

我有两个查询 - 这两个查询都在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$$

2 个答案:

答案 0 :(得分:0)

第二个查询加入h.idItem=l.id

没有表格别名为L。应该是c

答案 1 :(得分:0)

仅供记录。答案是上游对象的插入顺序。

我在两个表中插入一个分解为公共数据和属性的对象。从概念上讲,我插入一个项目,但实际上我正在执行两个插入。触发器与公共数据相关联,该数据触发了更新目录的序列。

目录触发了统计引擎的更新,告诉它有一个新项目并更新其内部模型。这反过来又试图调用对象特定的属性。

问题是因为触发器在两部分插入的第一部分上触发,属性数据尚未存在,因此统计引擎无法使用它并且失败 - 但是当我硬编码一个id来测试它工作正常,因为它是针对我已经存在的已经创建的对象。

那么课程?两部分插入的第一部分上的触发器将在第二部分开始之前触发 - 因此,如果数据不存在,则不要指望下游触发器能够找到数据。

其他课程:在决定重新规范表格之前先思考......