2014-01-06 98 views
0

我一直試圖從java創建觸發器,它不會工作。MySQL:創建一個觸發器不斷給我語法錯誤

String trigger = String.format("CREATE TRIGGER `%s` AFTER %s ON %s BEGIN INSERT INTO `ndb_log` (`table_name`, `action`, `time`) VALUES ('%s', '%s', UNIX_TIMESTAMP()) END;", 
      name, this.event.toUppercase(), this.table, this.table, this.event.toLowercase()); 

CREATE TRIGGER `onnc_censorINSERT` AFTER INSERT ON nc_censor BEGIN INSERT INTO `ndb_log` (`table_name`, `action`, `time`) VALUES ('nc_censor', 'insert', UNIX_TIMESTAMP()); END; 

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL語法錯誤;檢查對應於你的MySQL服務器版本使用附近的正確語法手冊「BEGIN INSERT INTO ndb_logtable_nameactiontime)VALUES(」 nc_censor」在行1

我不是在phpMyAdmin運行此,服務器控制檯或類似的東西,我需要從一個String的java運行它,我在我的班級呼叫this.mysql.update(trigger);「基本上」運行它

我曾嘗試在ssh mysql中運行創建觸發字符串,但它也不起作用

回答

0

兩件事s:(1)你錯過了觸發器聲明的FOR EACH ROW子句; (2)你不需要BEGIN和END,因爲你的觸發器只執行一條語句。試試這個:

CREATE TRIGGER `onnc_censorINSERT` AFTER INSERT ON nc_censor FOR EACH ROW INSERT INTO `ndb_log` (`table_name`, `action`, `time`) VALUES ('nc_censor', 'insert', UNIX_TIMESTAMP()); 
+0

我只想插入1條記錄,不管有多少行插入,所以我怎樣才能做到這一點? –

+0

這似乎是一個觸發器不適合,然後。對操作所影響的每一行執行觸發器;沒有辦法改變這種行爲。因此,您最好在批次INSERT的開始或結束時通過前端代碼運行INSERT命令。 –