2012-12-29 34 views
2

我似乎無法追查爲什麼MySQL試圖更新表中的列時拋出一個錯誤給定以下內容。觸發導致MySQL錯誤1054未知列

更新查詢:

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 [email protected]) 
    as InvoiceStatus 
    WHERE InvoiceStatus='Open') IS NULL 
then 
insert into invoices 
set 
[email protected], 
InvoiceBillToName=ifnull((select CustomerName FROM customers WHERE [email protected]),'-'), 
InvoiceBillToAddress=etc; 

當然,作業表有一個JobID和CustomerID列。其他許多觸發器和我們的前端都利用這些色譜柱,並且工作完美無瑕。

以下查詢工作並返回正確的「cust-000002」。

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

而且下面的查詢工作(ItemCompleted = 0這個jobitem,所以它不觸發上述觸發):

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

所以,我正式堅持了上述信息。請幫忙 :)。

更新:

消除變量,並取代「@customer」(選擇客戶ID喬布斯WHERE作業ID = 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 [email protected] where JobID=old.JobID; 
end if; 

更新:

只是爲了確保我不是瘋了,我複製並粘貼觸發回來,我得到確切同樣的錯誤消息之前,所以這個問題是可再現的。另外,爲了徹底,「ItemCompleted = 1」的條目無法更新,但沒有錯誤,條目「ItemCompleted = 0」可以更新而沒有錯誤通過試圖通過我們的前端編輯條目逐一。我想我只是確定,因爲我現在徹底困惑。

回答

1

我會嘗試通過調用jobs.JobID來限定JobID,無論它在哪裏使用,用於額外的消除錯誤。

但是我的dba本能表明實際問題可能在別的地方 - 你可能有另一個觸發器被這個觸發器中發生的事情觸發......可能是作業或發票表上的觸發器?或者在同一張桌子上的AFTER UPDATE

SET GLOBAL general_log = 1打開您的常規日誌,然後運行導致觸發器中出現錯誤的查詢。

然後再次關閉通用日誌(這樣的錯誤比較容易找到,所以不要填寫您的硬盤驅動器),去看看在一般的日誌在什麼是真正發生當你打的錯誤...一般日誌應該實際上記錄從內部運行的查詢,除了最初導致觸發器觸發的手動運行的查詢之外。

+0

我最終追查到了另一個未被完全修改的觸發器,我在閱讀這篇文章之前就已經解決了,所以我無法看到日誌會說什麼,儘管我假設日誌會指向正確的方向,所以我真的覺得你提供了正確的答案。感謝您給我日誌工具以供將來調試。我正在尋找一個日誌打開,沒有找到正確的一個之前,跟蹤問題!我現在打開了日誌,可能會在不久的將來使用它。謝謝! – Damon

0

當你這樣做:

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

作業ID,沒有前綴,從工作表,你說你有列。現在old.JobIdjobitems.JobID,因爲old會引用觸發此操作的更新中使用的表。

檢查你是從jobitems匹配的列名是完全JOBID

+0

這是來自jobitems COPIED並粘貼到來自MySQL工作臺的此評論的列名稱。 - >「JobID」。我也在作業中檢查了列名,它也是「JobID」。 – Damon