2011-08-20 85 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):不能更新table'tabel_user'存儲在函數/觸發器中,因爲它已經被調用該存儲函數/觸發器的語句使用。

你能不能幫我...

回答

0

你發送的MySQL混合郵件。

cast_id在INSERT後觸發,但它正在尋找OLD.namaOLD.id。另一方面,OLD只有在調用UPDATE時才存在。我想你的意思是:

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

CREATE TRIGGER cast_id BEFORE INSERT ON tabel_user FOR EACH ROW BEGIN SET NEW.id = COMBINE(TWO_FRONT(NEW.nama),CHECK_AVABILITY(NEW.nama)); END; 謝謝,但有些改變之後,後到前 –