2011-08-20 79 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; 谢谢,但有些改变之后,后到前 –