2014-01-06 70 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命令。 –