2014-09-03 69 views
0

嗨,大家好我在触发器的某个位置有以下代码。 (INSERT AFTER触发器)MySQL TRIGGER奇怪的行为

DECLARE Interv int; 

在某些时候我使用下面的代码:

SELECT myfield FROM TABLE WHERE interv=new.interv 

但显然mysql的混淆了两个变量的值(NEW.INTERV AND INTERV)和鸵鸟政策返回我正确的查询的价值。

但是,如果我使用DECLARE Interv_Value int而不是DECLARE Interv int问题SELECT工作正常。

任何想法?我正在使用MySQL 5.1.68。

+1

你的桌子实际上有'interv'字段吗?如果是这样,那么难怪mysql会感到困惑。如果您将变量命名为与表字段相同,那么实际字段将优先于相同名称的变量。 – 2014-09-03 14:45:43

回答

0

这是什么令人困惑?

当你查询:

SELECT myfield 
FROM TABLE 
WHERE interv = new.interv; 

那么MySQL必须找出其中所有不合格的名字从何而来。它有一些规则。在这种情况下:

- First look at the columns in the `FROM` clause. 
- Then it look in the environment 

(这实际上是作用域规则,也涉及到子查询。)所以,你的查询被解释为:

SELECT myfield 
FROM TABLE 
WHERE table.interv = new.interv; 

作为一般规则,编写使用表的别名您查询指定列的来源。所以上面的查询可以写成:

SELECT myfield 
FROM TABLE t 
WHERE t.interv = new.interv; 

虽然你不是真的想要这个版本。

如果要使用变量,请将用户定义的变量与@一起使用,或给出与列名不太可能发生冲突的变量名称(对此,我使用v_前缀)。

+0

谢谢,现在工作正常! – 2014-09-03 16:33:06