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(*) 関数を使用しました。もう 1 つ - トリガーにいくつかの構文エラーがありました。修正しました。

したがって、トリガーは次のようになります-

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 に答える