SQL查询语法错误

问题描述:

 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

您的查询,剥离出在你的代码中的换行符后,是这样的:

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公平点;编辑。 –

你可以在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

如果是这种情况,语法错误将只包含值列表,而不包含表名和列表。 –