【问题标题】:Right syntax for Mysql before insert trigger with some values在插入带有某些值的触发器之前,Mysql 的正确语法
【发布时间】:2012-08-17 14:22:54
【问题描述】:

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

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;

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

【问题讨论】:

    标签: mysql triggers


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      相关资源
      最近更新 更多