2012-08-10 33 views
1

创建触发器这是我的代码:错误,同时通过JDBC对mysql5.5

triggerBuilder.append("DROP TRIGGER IF EXISTS `insert_associated_inquiry`; "); 
triggerBuilder.append(" DELIMITER %% "); 

triggerBuilder.append(" CREATE TRIGGER insert_associated_inquiry BEFORE UPDATE ON inquiry "); 
triggerBuilder.append(" FOR EACH ROW Begin ");  

triggerBuilder.append(" insert into associated_inquiries(inquiry_id , subject , content , inquiry_date , preferred_date) "); 
triggerBuilder.append("values"); 
     triggerBuilder.append(" ("); 
      triggerBuilder.append(" OLD.id , "); 
      triggerBuilder.append(" OLD.subject , "); 
      triggerBuilder.append(" OLD.content , "); 
      triggerBuilder.append(" OLD.created_on , "); 
      triggerBuilder.append(" OLD.preffered_date "); 
     triggerBuilder.append(") ; "); 

triggerBuilder.append(" END %% "); 

triggerBuilder.append(" DELIMITER ; "); 

con.createStatement().execute(triggerBuilder.toString()); 

这是错误抛出:

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: 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 'DELIMITER %% CREATE TRIGGER insert_associated_inquiry 
BEFORE UPDATE ON inquiry ' at line 1 

有什么能为这个错误的原因和解决方案。 请帮忙。谢谢。

+0

如果使用另一个分隔符字符串,是否会得到相同的错误? (如'$$'或'//') – Jocelyn 2012-08-10 10:00:13

+0

@Jocelyn:是的,我得到了同样的错误。 – 2012-08-10 10:01:02

+0

[mysql jdbc驱动程序不支持多语句触发器中的分隔符]的可能重复(http://stackoverflow.com/questions/3481771/mysql-jdbc-driver-does-not-support-delimiters-in-triggers-with -multiple-statemen) – 2013-12-17 07:42:57

回答

4

不要对JDBC和MySQL使用分隔符。分隔符仅用于MySQL控制台,以便它可以告诉您输入的触发器,存储过程等何时结束。在JDBC中,您将整个SQL字符串放在一起,然后将其发送到数据库。由于您掌控SQL何时发送到数据库,因此不需要使用分隔符。

我从代码中删除了两条DELIMITER行并使用了%%分隔符,并将DROP TRIGGER命令单独发送到数据库。我留下的代码如下:

con.createStatement().execute("DROP TRIGGER IF EXISTS `insert_associated_inquiry`"); 

triggerBuilder.append(" CREATE TRIGGER insert_associated_inquiry BEFORE UPDATE ON inquiry "); 
triggerBuilder.append(" FOR EACH ROW Begin ");  

triggerBuilder.append(" insert into associated_inquiries(inquiry_id , subject , content , inquiry_date , preferred_date) "); 
triggerBuilder.append("values"); 
     triggerBuilder.append(" ("); 
      triggerBuilder.append(" OLD.id , "); 
      triggerBuilder.append(" OLD.subject , "); 
      triggerBuilder.append(" OLD.content , "); 
      triggerBuilder.append(" OLD.created_on , "); 
      triggerBuilder.append(" OLD.preffered_date "); 
     triggerBuilder.append(") ; "); 

triggerBuilder.append(" END "); 

con.createStatement().execute(triggerBuilder.toString()); 

此代码似乎工作,因为我可以无误地运行此代码,无论触发器是否已存在。如果触发器以前不存在,则创建该触发器。

1

原因是因为“分隔符”不是mysql标准的一部分,只是删除了分隔符的句子,你的代码应该可以工作。