触发导致MySQL错误1054未知列

时间:2012-12-29 20:13:50

标签: mysql triggers mysql-error-1054

我似乎无法追查为什么MySQL在尝试更新表中的列时会抛出错误,给出以下内容。

更新查询是:

update jobitems set itemprice=itemprice/100;

错误是:

 Error Code: 1054. Unknown column 'JobID' in 'where clause'

当我从jobitems上的触发器中删除以下内容时,更新将起作用。

DELIMITER $$
CREATE
DEFINER=`root`@`localhost`
TRIGGER `alacarte`.`jobitems_beforeupdate`
BEFORE UPDATE ON `alacarte`.`jobitems`
FOR EACH ROW
Begin
declare customer varchar(45);
Set @customer = (select CustomerID FROM jobs WHERE JobID=old.JobID);
If new.ItemCompleted<=>1
AND (select InvoiceStatus
    FROM 
        (Select InvoiceStatus, CustomerID
        FROM invoices
        as custinvoices
        Where CustomerID=@customer)
    as InvoiceStatus
    WHERE InvoiceStatus='Open') IS NULL
then
insert into invoices
set
CustomerID=@customer,
InvoiceBillToName=ifnull((select CustomerName FROM customers WHERE CustomerID=@customer),'-'),
InvoiceBillToAddress=etc;

当然,jobs表有一个JobID和CustomerID列。许多其他触发器和我们的前端都使用这些列,它们可以完美地工作。

以下查询有效并返回&#34; cust-000002&#34;这是正确的。

Set @customer = (select CustomerID FROM jobs WHERE JobID='ALC-20121119-001');
select @customer;

此外,以下查询有效(此作业项的ItemCompleted = 0,因此不会触发上述触发器):

update jobitems set itemprice=itemprice/100 where JobID='ALC-20121119-001';

所以,我正式坚持上述信息。请帮忙:)。

更新

消除变量并替换&#34; @ customer&#34;在整个触发器中使用(选择CustomerID FROM jobs WHERE JobID = old.JobID)会产生与预期相同的错误。

此外,通过修改触发器,错误消失了。我只是以一种新的方式使用变量而且它有效。以下内容将@customer的输出添加到每个作业的测试列中并完美地运行。错误!

declare customer varchar(45);
Set @customer = (select CustomerID FROM jobs WHERE JobID=old.JobID);

If new.ItemCompleted<=>1
then
update jobs set testcol=@customer where JobID=old.JobID;
end if;

更新

为了确保我不疯狂,我复制并粘贴了触发器,我得到了与之前完全相同的错误消息,因此这个问题是可重现的。另外,为了彻底,使用&#34; ItemCompleted = 1&#34;无错误地更新&#34; ItemCompleted = 0&#34;从尝试通过我们的前端逐个编辑条目时找到的可以无错误地更新。我想我只是确定,因为我现在感到非常困惑。

2 个答案:

答案 0 :(得分:1)

我会尝试通过在任何地方调用jobs.JobID来验证JobID,以进行额外的消除。

但是我的dba本能暗示实际问题可能在其他地方 - 你可能有另一个触发器被这个触发器中发生的事情解雇了......可能是作业或发票表上的触发器?或者在同一张桌子上AFTER UPDATE

使用SET GLOBAL general_log = 1启用常规日志,然后运行导致触发错误的查询。

然后再次关闭常规日志(因此错误更容易找到,所以不要填满你的硬盘),然后在常规日志中查看真正发生的确切内容当您遇到错误时...一般日志应该实际记录从内部触发器运行的查询,此外还有您手动运行的查询最初导致引发攻击。

答案 1 :(得分:0)

当你这样做时:

(select CustomerID FROM jobs WHERE JobID=old.JobID)

JobID ,没有前缀,是 jobs 表中的列,您说您拥有该列。现在 old.JobId jobitems.JobID ,因为旧引用了更新中使用的触发此表的表。

检查您从 jobitems 匹配的列名是 jobID