2010-05-15 28 views
1

我的應用程序中的業務邏輯需要我在表Y中插入一行時在表X中插入一行。此外,它應該只在特定時間之間執行(我必須查詢另一個表格)。我曾考慮過每5分鐘運行一次腳本來檢查一下,但我偶然發現觸發器,並認爲這可能是更好的方法。在sql觸發器中運行存儲過程

但是我發現程序的語法有點令人迷惑,我不斷收到錯誤,我不知道如何解決。這裏是我開始的地方:

CREATE TRIGGER reservation_auto_reply 
AFTER INSERT ON reservation 
FOR EACH ROW 
BEGIN 
IF NEW.sent_type = 1 /* In-App */ 
THEN INSERT INTO `messagehistory` (`trip`, `fk`, `sent_time`, `status`, `message_type`, `message`) 
VALUES (NEW.trip, NEW.psk, 'NOW()', 'submitted', 4, 'This is an automated reply to reservation'); 
END; 

我在statmenet的VALUES部分出現錯誤,但我不知道在哪裏。我仍然需要查詢其他表格以獲取我需要的信息,但我甚至無法通過這部分。任何幫助表示讚賞,包括許多例子的鏈接..謝謝

回答

2

我不知道你爲reservation.sent_time的數據類型定義了什麼,但我注意到你把NOW()函數放在引號中,使它成爲一個字符串'NOW()'而不是函數調用來獲取當前時間。


好的,這是另外兩個問題:

首先,在MySQL觸發語言IF statement需要塊後END IF;

二,您是否在使用DELIMITER?例如:

DELIMITER // 

CREATE TRIGGER reservation_auto_reply 
AFTER INSERT ON reservation 
FOR EACH ROW 
BEGIN 
IF NEW.sent_type = 1 /* In-App */ 
THEN 
    INSERT INTO `messagehistory` (`trip`, `fk`, `sent_time`, `status`, `message_type`, `message`) 
    VALUES (NEW.trip, NEW.psk, NOW(), 'submitted', 4, 'This is an automated reply to reservation'); 
END IF; 
END// 

DELIMITER ; 

這是必需的,因爲mysql客戶端允許您以交互模式或SQL腳本運行多個語句。但它有點愚蠢 - 它將輸入視爲一個SQL語句,直到它到達語句的終止符。通常終止符是分號(;)。

但你的觸發器體內有文字分號!如果mysql客戶端停在第一個分號處,它將嘗試使用不完整的語句來定義觸發器。

mysql客戶端中的解決方案是暫時將語句終止符更改爲某些其他字符或不是出現在您的觸發器正文中的字符序列。例如://

(注意DELIMITER命令是mysql客戶端的內置。如果你是從你的應用程序中執行動態SQL語句它不承認。)

+0

您好感謝比爾,我仍然被刪除引號,但它不起作用。我知道語法有很多問題,我一直在嘗試不同的東西,沒有任何運氣。 – Ying 2010-05-15 21:48:48

相關問題