在使用某些值插入触发器之前,Mysql的正确语法

时间:2012-08-16 00:44:43

标签: mysql triggers

我想创建一个before insert触发器,它使用新值来插入以检查触发器是否应该让插入发生或在某些条件下停止它。我无法找到该触发器的正确​​语法,但这里是足够明确的伪代码:

CREATE TRIGGER my_first_trigger BEFORE INSERT COMMENT VALUES(comment, #commentPIID, #commentUserID)

FOR EACH ROW
BEGIN
IF
(SELECT USER.ID
FROM USER LEFT JOIN PI_REMINDER ON  PI_REMINDER.userID == USER.ID
WHERE PI_REMINDER.ID == commentPIID && USER.ID == commentUserID) IS NOT NULL)
OR
 ((SELECT userID
FROM pishared
WHERE PIID == commentPIID && userID ==commentUserID && acceot == 1) IS NOT NULL)

THEN
INSERT INTO COMMENT VALUES(comment, #commentPIID, #commentUserID)

END IF;
END;

有人能告诉我在伪代码中使用正确的语法吗?

1 个答案:

答案 0 :(得分:1)

据我所知,触发器应该限制一些插入,在这种情况下,您可以检查条件,然后抛出一个错误以逃避inseкtion。 MySQL中的错误可以使用MySQL 5.5中的SIGNAL语句生成,也可以调用未知过程(例如CALL proc100)。

我使用COUNT(*)函数来知道另一个表中是否有相应的记录。还有一件事 - 你的触发器中有一些语法错误,我已经纠正了它们。

因此,触发器可能如下所示 -

CREATE TRIGGER my_first_trigger BEFORE INSERT ON COMMENT
FOR EACH ROW
BEGIN
  SET @cnt = NULL;

  SELECT COUNT(*) INTO @cnt FROM USER
    LEFT JOIN PI_REMINDER
      ON PI_REMINDER.userID = USER.ID
  WHERE
    PI_REMINDER.ID = NEW.commentPIID AND USER.ID = NEW.commentUserID;

  IF @cnt = 0 THEN
    SIGNAL SQLSTATE '02000';
  END IF;

  SELECT COUNT(*) INTO @cnt FROM pishared
  WHERE
    PIID = NEW.commentPIID AND userID = NEW.commentUserID AND acceot = 1;

  IF @cnt = 0 THEN
    SIGNAL SQLSTATE '02000';
  END IF;

END;