2011-08-20 4 views
1
CREATE FUNCTION TWO_FRONT(txt CHAR(30)) 
RETURNS CHAR(2) 
RETURN SUBSTRING(txt, 1, 2); 

DELIMITER $$ 
CREATE FUNCTION CHECK_AVABILITY(t_nama CHAR(30)) 
RETURNS INT(4) 
BEGIN 
DECLARE vreturn INT(4); 
DECLARE P CHAR(8); 
SET p = (SELECT MAX(id) FROM tabel_user WHERE nama like CONCAT(TWO_FRONT(t_nama),'%')); 
IF ISNULL(p)THEN 
    SET vreturn = 0; 
ELSE 
    SET vreturn = SUBSTRING(p, 4, 4); 
END IF; 
RETURN vreturn; 
END $$ 
DELIMITER; 

CREATE FUNCTION COMBINE(fn CHAR(2), nu CHAR(4)) 
RETURNS CHAR(7) 
RETURN CONCAT(UPPER(fn),'-',nu); 

CREATE TRIGGER cast_id AFTER INSERT ON tabel_user 
FOR EACH ROW 
BEGIN 
UPDATE tabel_user SET id = COMBINE(TWO_FRONT(OLD.nama),CHECK_AVABILITY(OLD.nama)) WHERE id = OLD.id; 
END; 

Everyting 괜찮습니다하지만 난이를 삽입 한 후 ...MySQL의 기능 오류 1442

INSERT INTO tabel_user VALUES('','Blabla'); 

오류가

ERROR 1442 (HY000) ...오고있다 : 업데이트 할 수 없습니다 이 저장 함수/트리거를 호출 한 문에 의해 이미 사용 되었기 때문에 저장 함수/트리거에 'tabel_user'테이블이 있습니다.

당신은 당신의 MySQL을 혼합 메시지를 보내는 ...

답변

0

날 수 있습니다.

cast_id가 INSERT 이후에 발생하지만 OLD.namaOLD.id을 찾고 있습니다. 한편 OLDUPDATE이 호출 될 때만 존재합니다. 나는 당신이 의미 생각 :

CREATE TRIGGER cast_id AFTER INSERT ON tabel_user 
FOR EACH ROW 
BEGIN 
    -- notice no "UPDATE" or "WHERE", "SET" implies "set on this current row" 
    SET NEW.id = COMBINE(TWO_FRONT(NEW.nama),CHECK_AVABILITY(NEW.nama)); 
END; 
+0

은 각 행에 대해 tabel_user ON INSERT하기 전에 트리거 cast_id을 만들 시작 SET NEW.id = (TWO_FRONT (NEW.nama), CHECK_AVABILITY (NEW.nama를)) 겸용; END; 감사하지만 일부 변경 사항은 AFTER TO BEFORE –