嗨,大家好,我在触发点上有以下代码。 (插入触发器后)

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_前缀)。

10-01 00:41