2012-12-29 3 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; 

당연히 jobs 테이블에는 JobID 및 CustomerID 열이 있습니다. 많은 다른 트리거와 프런트 엔드가이 열을 사용하며 완벽하게 작동합니다.

다음 쿼리는 올바르게 작동하고 "cust-000002"를 반환합니다. (이것은 위의 트리거를 트리거되지 않도록,이 jobitem에 대한 ItemCompleted = 0)

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

은 또한 다음과 같은 쿼리가 작동합니다

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

그래서, 나는 공식적으로 위의 정보와 함께 붙어있다. 도와주세요 :).

업데이트 :

변수를 제거하고으로 "@customer 교체"예상대로 트리거 걸쳐 동일한 오류를 줄 (작업 ID = old.JobID 잡 CustomerID를 선택).

또한 트리거를 수정하여 오류가 사라집니다. 변수를 단순히 새로운 방식으로 사용했는데 제대로 작동합니다. 다음은 각 작업에 대한 @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"의 항목은 오류없이의 프런트 엔드를 통해 항목을 편집하려고 시도하는 중 하나씩 업데이트 할 수 있습니다. 나는 내가 지금 thouroughly 혼란 스럽기 때문에 내가 단지 확인할 것이다라고 상상했다.

답변

1

추가 disambuguation을 위해 JobID를 사용하여 어디서나 jobs.JobID를 호출하여 자격을 부여하려고합니다.

그러나 실제 문제는 다른 곳에서 발생할 수 있다고 제안합니다.이 트리거에서 일어나는 일에 의해 해고 될 수있는 또 다른 방아쇠가있을 수 있습니다. 작업 또는 송장 테이블의 트리거 일 수 있습니까? 또는이 동일한 테이블의 AFTER UPDATE에 있습니까?

SET GLOBAL general_log = 1으로 일반 로그를 켠 다음 트리거에서 오류를 일으키는 쿼리를 실행하십시오.

그런 다음 일반 로그를 다시 끄고 (오류를 쉽게 찾을 수 있으므로 하드 드라이브를 채우지 마십시오.) 일반적인 로그에서 이 실제로 일 때 일어난 일을 정확히 살펴보십시오. 오류 ... 일반 로그 에서 실행되는 쿼리를 트리거와 실제로 트리거 한 트리거 이외에 수동으로 실행 한 쿼리를 실제로 기록해야합니다.

+0

완전히 수정되지 않은 복사 된 트리거 발사로 범인을 추적했습니다. 나는 로그가 옳은 방향으로 나를 가리키고 있다고 가정하고 있지만 로그를 통해 무엇을 말했는지를 알 수 없었기 때문에 이것을 읽으면서 바로 고쳤습니다. 그래서 나는 여러분이 정답을 상관없이 제공했다고 느낍니다. 추후 디버깅을위한 로그 도구를 제공해 주셔서 감사합니다. 내가 켜기 로그를 찾고 있었고 문제를 추적하기 전에 올바른 로그를 찾지 못했습니다! 나는 지금 로그를 켰고 아마 가까운 장래에 그것을 사용할 것입니다. 감사! – Damon

0

은 당신이 할 경우 :

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

작업 ID는 접두사없이, 당신은 당신이 말하는 작업 테이블에서 열입니다. 지금 old.JobIdjobitems.JobID입니다. 왜냐하면 old는이 작업을 트리거하는 업데이트에 사용 된 테이블을 참조하기 때문입니다.

작업 항목에서 일치하는 열 이름이 정확히 작업 ID인지 확인하십시오.

+0

jobitems COPYED의 열 이름이며 MySQL Workbench에서이 주석에 붙여 넣습니다. -> "JobID". 나는 또한 일자리에서 칼럼 이름을 확인했으며 그것은 또한 "JobID"이다. – Damon