mysql관련 트리거 오류 떄문에 질문 드립니다 0 2 2,177

by snow눈사람 [SQL Query] mysql trigger 트리거 [2019.11.21 00:53:00]


create table refriger
(foodname char(16),
foodtype char(4),
expirationdate integer,
thenumber char(16),
foodcondition char(4),
foodnumber int not null primary key,
modType char(4)
);

delimiter //
create trigger alarm_trigger
	after update
	on refriger
	for each row
begin
	insert into refriger values(old.foodname, old.foodtype, old.expirationdate, old.thenumber, 
    old.foodcondition,old.foodnumber, '수정');
end//
delimiter ;

insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values("닭다리", "육류", 7, "300g", "냉장", 1);
insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values("돼지목살", "육류", 7, "300g", "냉장", 2);
insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values("브로콜리", "야채", 21, "1개", "냉장", 3);
insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values("피망", "야채", 7, "300g", "냉장", 4);
insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values("채끝살", "육류", 7, "300g", "냉장", 5);
insert into refriger(foodname, foodtype, expirationdate, thenumber, foodcondition, foodnumber) values("대패삼겹살", "육류", 60, "500g", "냉동", 6);

update refriger set expirationdate = 5 where foodname ="닭다리";
select * from refriger;


이렇게 만들었는데 이걸 하면 can't update table in stored function/trigger because it is already used by statement 라는 오류가 발생합니다.

인터넷에서 검색해보니까

"발생의 내용은 결국 트리거 사용함에있어서 재귀용법은 사용이 안됩니다. trgtlbltmp 트리거가 걸려있는 tnltmp 테이블에 trgtnltmp 트리거는 insert, update, delete 는 할수없습니다.
에러문구는 그에 따른 문법오류를 말합니다."

라고는 하는데 제 생각에는 책에서 한거처럼하면 서로 데드락 안걸리고 사용할수있게 한게 new와 old를 사용해서 하면 가능한거처럼 되있는데

old를 사용해도 왜 재가 만든건 안되는지 이해가 안되네요 ㅠㅠ 책에서는 가능한데 왜 제가만든건 안되는지 이해가 안갑니다.

책에서는

use sqlDB;
drop table buyTbl;
create table backup_userTbl (
userID CHAR(8) NOT NULL PRIMARY KEY, 
name VARCHAR(10) NOT NULL, 
birthYear INT NOT NULL, 
addr CHAR(2) NOT NULL,
mobile1 CHAR(3), 
mobile2 CHAR(8), 
height SMALLINT,
mDate DATE,
 modTyoe char(2),
 modDate date,
 modUser varchar(256)
);

delimiter //
create trigger backUserTbl_UpdateTrg
after update on userTbl 
for each row
begin
insert into backup_userTbl values ( old.userID, 
old.name, old.birthYear, old.addr, old.mobile1, old.mobile2, 
old.height, old.mdate, '수정', curdate(), current_user());
end //
delimiter ;

이렇게 되있는데 다른게 없는게 같은데 안되서 너무 답답합니다 ㅜㅜ 5시간 넘게 아무리 머리를 굴려도 해결이 안되네요 고수님들 부탁드립니다 ㅠㅠ

 

by 마농 [2019.11.21 08:46:00]

작성하신 쿼리의 테이블은 한개로 서로 같은데 - refriger
책의 내용엔 대상 테이블이 두개로 서로 다르네요. - userTbl / backup_userTbl
또한, 중복키가 입력되는 로직 오류도 있구요.


by snow눈사람 [2019.11.21 18:41:01]

감사합니다 !!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입