我想创建一个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;
有人能告诉我在伪代码中使用正确的语法吗?
答案 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;