2011-05-01 24 views
1

看看這段代碼:這個觸發語法有什麼問題?

 
DELIMITER $$ 
DROP TRIGGER IF EXISTS `after_product_insert` $$ 
CREATE TRIGGER `after_product_insert` 
AFTER INSERT ON `products` 
    FOR EACH ROW 
    UPDATE `categories` SET product_count=product_count+1 where id = NEW.category_id; 
END$$ 

這運行正常,但顯示了一些錯誤。這裏是輸出:

 
Query OK, 0 rows affected (0.16 sec) 

ERROR 1064 (42000): 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 'END' at line 1 

因此,即使觸發器已創建 - 腳本(包含此觸發器)因錯誤而死亡。這可能很簡單,但不知何故,我錯過了這一點。幫助任何人?

+0

你可以嘗試改變:'where id ='into'where categories.id ='?我想這兩個表中都有一個「id」字段。 – 2011-05-01 17:54:43

+1

你也有一個沒有'BEGIN'的'END'。你可以刪除'END'或添加一個'BEGIN'。 – 2011-05-01 17:57:52

+0

'id'不會產生問題,因爲id在'更新類別'語句中使用。儘管如此,感謝END-BEGIN。我犯了一個可怕的錯誤。浪費時間。 – Vikash 2011-05-01 20:40:41

回答

4

這是一個兩表觸發器,所以id可能是不明確的。將表名添加到它。將表格名稱添加到每個字段參考中並不會造成什麼傷害。

沒關係。 UPDATE之前沒有BEGINFOR聲明似乎期望圍繞要執行的語句的BEGINEND

DELIMITER $$ 
DROP TRIGGER IF EXISTS `after_product_insert` $$ 
CREATE TRIGGER `after_product_insert` 
AFTER INSERT ON `products` 
    FOR EACH ROW 
    BEGIN 
    UPDATE `categories` 
     SET product_count=product_count+1 
     WHERE id = NEW.category_id; 
    END$$ 
+0

謝謝。我完全錯過了它。我想知道爲什麼mysql工作臺生成沒有'開始'的語句。 – Vikash 2011-05-01 17:55:33

+0

@Vikash:如果只有一條語句,則不需要BEGIN-END。 – 2011-05-01 18:00:52