0

我有两个查询 - 两者都在 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 上的catalog 中的每个唯一条目一对一。

我是再次盯着明显的流血,还是我缺少的 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$$
4

2 回答 2

0

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

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

于 2013-07-31T09:56:53.813 回答
0

只是为了记录。答案是上游对象的插入顺序。

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

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

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

所以教训?两部分插入的第一部分上的触发器将在第二部分开始之前触发 - 所以不要指望下游触发器能够找到不存在的数据。

其他教训:在决定重新规范您的表之前先考虑一下......

于 2013-08-01T02:48:31.310 回答