MySQL功能错误1442

时间:2011-08-20 05:05:21

标签: mysql

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;

一切都没关系,但在我插入之后......

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

错误即将来临......

  

错误1442(HY000):无法更新存储函数/触发器中的表'tabel_user',因为它已被调用此存储函数/触发器的语句使用。

你能帮助我......

1 个答案:

答案 0 :(得分: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;