我似乎无法追查为什么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;从尝试通过我们的前端逐个编辑条目时找到的可以无错误地更新。我想我只是确定,因为我现在感到非常困惑。
答案 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 。