2017-04-04 8 views
0

はそれで問題を見つけることができませんし、今しばらくの間しようとしてこのMySQLトリガーステートメントを修正するにはどうすればよいですか?

CREATE 
    TRIGGER `checkin_enforcement` BEFORE INSERT 
    ON `booking` 
    FOR EACH ROW BEGIN 

     IF (NEW.checkinDate < NEW.checkoutDate) THEN 
      INSERT INTO booking (bookingID, hotelNo, guestNo, checkinDate, checkoutDate, roomNo) VALUES (NEW.bookingID, NEW.hotelNo, NEW.guestNo, NEW.checkinDate, NEW.checkoutDate, NEW.roomNo); 

     ELSE 
      signal sqlstate '45000' set message_text = 'The checkin date must be less than the checkout date!'; 
     END IF; 


    END$$ 

#1064 - あなたのSQL構文でエラーが発生しています。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして正しい構文を調べて、近くの ''行で使用してください。

+0

が、これはループを作成しませんFOR後に必要とされていませんBEGIN?行を挿入する前に - トリガーと呼ばれる行を挿入するトリガーなどがあります。 – GurV

+0

@GurVの可能性は高いですが、私はそれを笑うことができる段階には到着できません – Josh

答えて

0

条件が成立したら、行を挿入する必要はありません。あなたはエラーを投げる必要があります。

また、on inserton insert or updateに変更しました。これは、データがテーブルに挿入された後でもこのルールを適用し続けることをお勧めします。そうでない場合は、on insertに変更してください。

はこれを試してみてください:

delimiter $$ 

create trigger checkin_enforcement 
before insert or update on booking 
for each row 
begin 
    if (new.checkindate >= new.checkoutdate) then 
     signal sqlstate '45000' set message_text = 'the checkin date must be less than the checkout date!'; 
    end if; 
end$$ 
+0

ああ大丈夫です。 "#1064 - SQL構文に誤りがあります。MySQLサーバのバージョンに対応したマニュアルをチェックして正しい構文をチェックして、近くで使用するか、予約時に更新してください。 各行に begin if(new。 checkinDate> = new.check 'at 2行目」@GurV – Josh

0
CREATE TRIGGER `checkin_enforcement` 
BEFORE INSERT ON `booking` 
FOR EACH ROW 
IF NEW.checkinDate >= NEW.checkoutDate THEN 
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The check-in date must be before the check-out date!'; 
END IF 

はEACH ROW

+0

このコードスニペットは歓迎されていますが、いくつかの助けを与えるかもしれませんが、説明があれば大幅に改善されます(// meta.stackexchange.com/q/ 114762)の* how * and * why *これが問題を解決することを覚えておいてください。あなたは今質問している人だけでなく将来の読者の質問に答えています。どのような制限や仮定が当てはまるか。 –

関連する問題