2017-04-04 81 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服務器版本對應的手冊,以便在第7行「'附近使用正確的語法。

+0

這會不會創建一個循環?在插入行之前 - 觸發器調用 - 它插入一行 - 再次調用觸發器 - 依此類推。 – GurV

+0

@GurV最有可能,但我不能到我可以測試它的舞臺大聲笑 – Josh

回答

0

如果條件通過,則不需要插入行。如果沒有,你只需要拋出錯誤。

此外,我將on insert更改爲on 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服務器版本的手冊,以便在附近使用正確的語法」或更新 每行 開始 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 

開始是成功後不要求每個ROW

+0

儘管這段代碼片段是受歡迎的,並且可能會提供一些幫助,但如果它包含解釋,它會[大大改善](// meta.stackexchange.com/q/ 114762)* how *和* why *解決了這個問題,請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在要求的人!請[編輯]你的回答以添加解釋,並給出什麼限制和假設適用。 –