2012-08-10 27 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標準的一部分,只是刪除了分隔符的句子,你的代碼應該可以工作。