0

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

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;

有人可以告诉我在那个伪代码案例中使用的正确语法吗?

4

1 回答 1

1

据我了解,触发器应该限制一些插入,在这种情况下,您可以检查条件,然后抛出错误以逃避插入。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;
于 2012-08-16T05:55:14.150 回答