MySQL TRIGGER奇怪的行为
问题描述:
嗨,大家好我在触发器的某个位置有以下代码。 (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。
答
这是什么令人困惑?
当你查询:
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
你的桌子实际上有'interv'字段吗?如果是这样,那么难怪mysql会感到困惑。如果您将变量命名为与表字段相同,那么实际字段将优先于相同名称的变量。 – 2014-09-03 14:45:43