2017-08-06 467 views
1
 Class.forName("com.mysql.jdbc.Driver"); 
     Connection con=DriverManager.getConnection("jdbc:mysql://localhost/exam","root","password"); 
     String q="insert into group" 
     +"(gname,des)" 
     +"values(?,?)"; 

     PreparedStatement p=con.prepareStatement(q); 
     p.setString(1,gname); 
     p.setString(2,des); 
     p.executeUpdate(); 
     con.close(); 

這是我添加組的代碼。但錯誤說我的查詢語法是錯誤的。我已經嘗試過使用表格中的單個核心,但仍然出現該錯誤。首先,我正在使用create語句,它也給出了相同的錯誤。請告訴我們這個查詢有什麼問題嗎?SQL查詢語法錯誤

com.mysql.jdbc.exceptions.jdbc4.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 'group(gname,des)values('Science','')' at line 1 
    sun.reflect.GeneratedConstructorAccessor16.newInstance(Unknown Source) 
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    com.mysql.jdbc.Util.handleNewInstance(Util.java:425) 
    com.mysql.jdbc.Util.getInstance(Util.java:408) 
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943) 
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) 
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) 
    com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) 
    com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) 
    com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490) 
    com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) 
    com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079) 
    com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013) 
    com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104) 
    com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998) 
    org.apache.jsp.groupreg_jsp._jspService(groupreg_j 
+0

表中是gname和des varchars? – yaswanth

+0

是的,它們都是組表中的varchar。 – rango

回答

4

您的查詢,剝離出在你的代碼中的換行符後,是這樣的:

insert into group(gname,des)values(?,?) 

換句話說,你試圖插入一個名爲group表。這是不允許的,因爲GROUP是MySQL中的保留字。

the manual

大部分在表中的保留字通過標準SQL作爲列或表名(例如,GROUP)禁止的。

你需要選擇一個不同的表名(推薦)或環繞字group與反引號,像這樣:

INSERT INTO `group` (gname, des) VALUES (?, ?) 

參見手動輸入。

此外,請確保您有適當的空間;現在缺少間距會導致許多情況下出現其他問題。

+0

N.B. 「*標準* SQL禁止」。在MySQL中,你仍然可以反駁這個...'INSERT INTO \'GROUP \'...'。在同一頁上更高,*如果您按第9.2節「[模式對象名稱](https://dev.mysql.com/doc/refman/5.7/en/identifiers)」中所述引用它們,則允許使用保留字作爲標識符.html)。「* –

+1

@ Michael-sqlbot公平點;編輯。 –

0

你可以在Java中用適當的間距在單行中寫完整的查詢,而不用寫SQL查詢方式。你應該能夠確定第一個錯誤是間距。這可以從這個被糾正(你用什麼):

String q = "insert into group" 
      +"(gname,des)" 
      +"values(?,?)"; 

這個(修改後的查詢):

String q = "insert into group (gname, des) values(?, ?)"; 

上述變化一旦做出,使得它的可讀性。接下來的事情正如@EdCottrell所指出的,避免使用受限關鍵字作爲表名。根據數據庫類型,可能會有與此相關的問題。

希望這會有所幫助!

+1

缺少的空格不是問題,因爲解析器可以使用'('和')'作爲標記分隔符。 –

+0

@MarkRotteveel,分隔符只對'table_name(column_name1,column_name2)'有幫助,但是像這樣'table_name(column_name1,column_name2)values(column_value1,column_value2)'它不會。因此錯誤。 –

+0

如果是這種情況,語法錯誤將只包含值列表,而不包含表名和列表。 –