0

チェック制約とコード 1 の代わりにトリガーを使用しようとしていますが、エラーが発生します。

CREATE TRIGGER conflict 
ON roozane 
FOR EACH ROW 
BEGIN 
if rDate = NEW.rDate then
if NEW.rStartTime < rStartTime AND NEW.rEndTime < rEndTime then
INSERT INTO roozane (rID,rDate,rStartTime,rEndTime,rPlace,rComment,rType) values (NEW.rID,NEW.rDate,NEW.rStartTime,NEW.rEndTime,NEW.rPlace,NEW.rComment,NEW.rType);
end if
end if
END;$$ 

そしてエラー

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON roozane FOR EACH ROW BEGIN if ( rDate=NEW.rDate ) then if ( NEW.rStart' at line 2

編集

CREATE TRIGGER conflict BEFORE INSERT
ON roozane 
FOR EACH ROW 
BEGIN 
if rDate = NEW.rDate then
if NEW.rStartTime < rStartTime AND NEW.rEndTime < rEndTime then
INSERT INTO roozane (rID,rDate,rStartTime,rEndTime,rPlace,rComment,rType) values (NEW.rID,NEW.rDate,NEW.rStartTime,NEW.rEndTime,NEW.rPlace,NEW.rComment,NEW.rType);
end if
end if
END;$$ 

そしてエラー

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 7

ヘルプのための tnx

4

3 に答える 3

1

*trigger_time* と *trigger_event* が必要です。例えば: CREATE TRIGGER conflict AFTER INSERT

于 2013-07-01T20:57:06.110 に答える
0

トリガーにいくつかの問題があります。

構文エラーと論理エラーに関する限り

  1. DELIMITER $$エラー メッセージを見ると、スクリプトの開始時に使用しなかったようです。
  2. トリガーに宣言されていない変数が 3 つありますrDate, rStartTime, rEndTime. ストアド プロシージャ レベルの変数を使用する場合は、最初にそれらを宣言し、最終的にそれらに値を割り当てる必要があります。
  3. @BillKarwinが彼の回答で述べたように、各ステートメントの最後にセミコロンを付ける必要があり、トリガーのブロックを閉じたIF ... END IF;後にセミコロンは必要ありません。ENDBEGIN...ENDDELIMITER$$

あなたのトリガーの構文的に正しいバージョンが続くかもしれないと言われています

DELIMITER $$
CREATE TRIGGER conflict 
BEFORE INSERT ON roozane 
FOR EACH ROW 
BEGIN 
  DECLARE rDate      DATE;
  DECLARE rStartTime TIME;
  DECLARE rEndTime   TIME;

  IF rDate = NEW.rDate THEN
    IF NEW.rStartTime < rStartTime AND NEW.rEndTime < rEndTime THEN
        INSERT INTO roozane (rID,rDate,rStartTime,rEndTime,rPlace,rComment,rType)
        VALUES(NEW.rID,NEW.rDate,NEW.rStartTime,NEW.rEndTime,NEW.rPlace,NEW.rComment,NEW.rType);
    END IF;
  END IF;
END$$ 

これは、トリガーが正常に作成されていることを示す SQLFiddle デモです。宣言れた変数にはデフォルトで値があり、他の値が割り当てられていないため、何もしません。NULL

最も重要な部分は次のとおりです。変数の問題が修正される場合、残念ながらトリガー機能しません。トリガーのサポートがかなり制限されているMySqlではINSERT、同じテーブルでデータ操作ステートメント(あなたの場合)が許可されないためです。 (roozaneあなたの場合)トリガーを取り付けています。

ここで、トリガーを修正するのに役立つように、トリガーで何をチェックするかを説明する必要があります。

于 2013-07-02T23:29:23.923 に答える
0

end ifこれらの複合ステートメントを終了するには、それぞれの後にセミコロンが必要です。

ENDおそらくDELIMITER $$、mysql クライアントでステートメント ターミネータを変更するために使用したため、最後の の後にセミコロンは必要ありません。

以下をテストしました。構文エラーは発生しませんでしたが、もちろん、呼び出されたテーブルがないroozaneため、別のエラーが発生しました。:-)

CREATE TRIGGER conflict BEFORE INSERT
ON roozane 
FOR EACH ROW 
BEGIN 
if rDate = NEW.rDate then
if NEW.rStartTime < rStartTime AND NEW.rEndTime < rEndTime then
INSERT INTO roozane (rID,rDate,rStartTime,rEndTime,rPlace,rComment,rType) values (NEW.rID,NEW.rDate,NEW.rStartTime,NEW.rEndTime,NEW.rPlace,NEW.rComment,NEW.rType);
end if;
end if;
END$$ 
于 2013-07-01T21:56:52.083 に答える